關(guān)鍵字:結(jié)構(gòu)化并發(fā)祟印、線程肴沫、Kotlin、協(xié)程
多線程的并發(fā)是全局的蕴忆,而結(jié)構(gòu)化并發(fā)中颤芬,每個并發(fā)都有自己作用域。
1. 線程的并發(fā)不是結(jié)構(gòu)化的
可以想想這幾個問題在 Java 中要怎么解決:
- 結(jié)束一個線程時孽文,怎么同時結(jié)束這個線程中創(chuàng)建的子線程驻襟?
- 當(dāng)某個子線程在執(zhí)行時需要結(jié)束兄弟線程要做怎么做?
- 如何等待所有子線程都執(zhí)行完了再結(jié)束父線程芋哭?
這些問題都可以通過共享標(biāo)記位沉衣、CountDownLatch 等方式實現(xiàn)。但這兩個例子讓我們意識到减牺,線程間沒有級聯(lián)關(guān)系豌习;所有線程執(zhí)行的上下文都是整個進(jìn)程,多個線程的并發(fā)是相對整個進(jìn)程的拔疚,而不是相對某一個父線程肥隆。
這就是線程的「非結(jié)構(gòu)化」。
2. 業(yè)務(wù)的并發(fā)是結(jié)構(gòu)化的
通常稚失,每個并發(fā)操作都是在處理一個任務(wù)單元栋艳,這個任務(wù)單元可能屬于某個父任務(wù)單元,同時它也可能有子任務(wù)單元句各。而每個任務(wù)單元都有自己的生命周期吸占,子任務(wù)的生命周期理應(yīng)繼了父任務(wù)的生命周期晴叨。
這就是業(yè)務(wù)的「結(jié)構(gòu)化」。
3. 結(jié)構(gòu)化的并發(fā)應(yīng)該是什么樣矾屯?
在結(jié)構(gòu)化的并發(fā)中兼蕊,每個并發(fā)操作都有自己的作用域,并且:
在父作用域內(nèi)新建作用域都屬于它的子作用域件蚕;
父作用域和子作用域具有級聯(lián)關(guān)系孙技;
父作用域的生命周期持續(xù)到所有子作用域執(zhí)行完;
當(dāng)主動結(jié)束父作用域時排作,會級聯(lián)結(jié)束它的各個子作用域牵啦。
例如 Kotlin 的協(xié)程就是 結(jié)構(gòu)化的并發(fā),它有 「協(xié)程作用域(CoroutineScope)」 的角色妄痪。全局的 GlobalScope 是一個作用域蕾久,每個協(xié)程自身也是一個作用域。新建的協(xié)程對象和父協(xié)程保持著級聯(lián)關(guān)系拌夏。
可以看出 協(xié)程的并發(fā) 和 業(yè)務(wù)的并發(fā) 更相似,它們都具有結(jié)構(gòu)上的關(guān)聯(lián)履因。