什么是協(xié)程
官方描述:協(xié)程通過將復(fù)雜性放入庫來簡化異步編程翎猛。程序的邏輯可以在協(xié)程中順序地表達(dá)瓢捉,而底層庫會為我們解決其異步性。該庫可以將用戶代碼的相關(guān)部分包裝為回調(diào)办成、訂閱相關(guān)事件、在不同線程(甚至不同機(jī)器)上調(diào)度執(zhí)行搂漠,而代碼則保持如同順序執(zhí)行一樣簡單迂卢。就像非常輕量級的線程。
為什么需要協(xié)程
- 輕量級
協(xié)程就像非常輕量級的線程桐汤。線程是由系統(tǒng)調(diào)度的而克,線程切換或線程阻塞的開銷都比較大。而協(xié)程依賴于線程怔毛,但是協(xié)程掛起時不需要阻塞線程员萍,幾乎是無代價的,協(xié)程是由開發(fā)者控制的拣度。所以協(xié)程也像用戶態(tài)的線程碎绎,非常輕量級,一個線程中可以創(chuàng)建任意個協(xié)程抗果。
內(nèi)存泄漏更少
使用結(jié)構(gòu)化并發(fā)機(jī)制在一個作用域內(nèi)執(zhí)行多項(xiàng)操作筋帖。內(nèi)置取消支持
取消操作會自動在整個協(xié)程層次內(nèi)傳播。jetpack集成
許多jetpack庫都包含提供全面的協(xié)程支持?jǐn)U展冤馏,某些庫還提供自己的協(xié)程作用域日麸。方便使用
如果后臺執(zhí)行一個復(fù)雜任務(wù),第二個任務(wù)依賴上一個任務(wù)的執(zhí)行結(jié)果逮光,使用寫成可以方便實(shí)現(xiàn)代箭。這點(diǎn)類似于java8的Future以及Rxjava中的鏈?zhǔn)秸{(diào)用。
基礎(chǔ)
gradle配置
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3'
- 掛起函數(shù)
suspend
修飾符修飾的函數(shù)是掛起函數(shù)涕刚。掛起函數(shù)掛起協(xié)程時嗡综,不會阻塞協(xié)程所在的線程。掛起函數(shù)執(zhí)行完后恢復(fù)協(xié)程副女,后面的代碼才能繼續(xù)執(zhí)行蛤高。掛起函數(shù)只能在協(xié)程中調(diào)用蚣旱。
- CoroutineDispatcher
CoroutineDispatcher是協(xié)程調(diào)度器,決定協(xié)程運(yùn)行的線程或線程池戴陡。
coroutines-core
中CoroutineDispatcher有三種標(biāo)準(zhǔn)實(shí)現(xiàn):
Dispatchers.Default 指定線程為共有的線程池塞绿,線程數(shù)量最少為2最大為CPU數(shù)
Dispatchers.IO IO線程
Dispatchers.Main 主線程
Dispatchers.Unconfined 不指定線程
- 開啟協(xié)程方法
開啟方式比較 | 是否創(chuàng)建新協(xié)程 | 是否阻塞當(dāng)前線程 | 是否指定協(xié)程調(diào)度器 | 是否有返回值 | 其他 |
---|---|---|---|---|---|
launch{} | 是 | 否 | 是 | 否 | |
async{} | 是 | 否 | 是 | 是 | 用await()獲取返回值 |
runBlocking {} | 是 | 是 | 是 | 是 | 主要用于測試 |
withContext{} | 否 | 掛起協(xié)程不阻塞縣城 | 是 | 是 | 可讓您在不引入回調(diào)的情況下控制任何代碼行的線程池,因此您可以將其應(yīng)用于非常小的函數(shù)恤批,例如從數(shù)據(jù)庫中讀取數(shù)據(jù)或執(zhí)行網(wǎng)絡(luò)請求异吻。 |
- CoroutineScope
CoroutineScope 會跟蹤它使用 launch 或 async 創(chuàng)建的所有協(xié)程。您可以隨時調(diào)用 scope.cancel() 以取消正在進(jìn)行的工作(即正在運(yùn)行的協(xié)程)喜庞。不過诀浪,與調(diào)度程序不同,CoroutineScope 不運(yùn)行協(xié)程延都。
- Job
Job 是協(xié)程的句柄雷猪。使用 launch 或 async 創(chuàng)建的每個協(xié)程都會返回一個 Job 實(shí)例,該實(shí)例是相應(yīng)協(xié)程的唯一標(biāo)識并管理其生命周期晰房。