帶著以下幾個問題去簡單理解協(xié)程原理。
1.協(xié)程到底是怎么創(chuàng)建和啟動的?
簡略版可參考這篇:
Kotlin協(xié)程createCoroutine和startCoroutine原理
詳細版可參考《深入理解Kotlin協(xié)程》第三章。
2.協(xié)程是如何描述的?
協(xié)程是通過Job去描述的。
基本上每啟動一個協(xié)程就會產(chǎn)生對應(yīng)的Job。
它提供了六種狀態(tài)來表示協(xié)程的運行狀態(tài)。
New: 創(chuàng)建
Active: 運行
Completing: 已經(jīng)完成等待自身的子協(xié)程
Completed: 完成
Cancelling: 正在進行取消或者失敗
Cancelled: 取消或失敗
詳細版可參考《深入理解Kotlin協(xié)程》第五章第二節(jié)。
參考鏈接:
Kotlin協(xié)程實現(xiàn)原理:CoroutineScope&Job
3.協(xié)程是如何與線程關(guān)聯(lián)的?
可參考這篇:
Kotlin協(xié)程之Dispatchers原理
簡單總結(jié):
https://zhuanlan.zhihu.com/p/549348531
Dispatchers是協(xié)程框架中與線程交互的關(guān)鍵。底層會有不同的線程池,Dispatchers.Default、IO,協(xié)程任務(wù)來了的時候會封裝成一個個的Runnable,丟到線程中執(zhí)行,這些Runnable的run方法中執(zhí)行的其實就是continuation.resume,也就是launch的Lambda生成的SuspendLambda匿名內(nèi)部類,也就是開啟協(xié)程狀態(tài)機,開始協(xié)程的真正執(zhí)行。
4.協(xié)程是怎么切換線程的?
簡單總結(jié):CoroutineContext 里存放著協(xié)程的分發(fā)器。CoroutineDispatcher決定了運行在哪個線程上。
詳細可參考這幾篇:
Kotlin 協(xié)程源碼解析
Kotlin 協(xié)程調(diào)度切換線程是時候解開真相了
5.協(xié)程執(zhí)行、掛起、恢復(fù)的流程
