协程简单理解
带着以下几个问题去简单理解协程原理。
1.协程到底是怎么创建和启动的?
简略版可参考这篇:
Kotlin协程createCoroutine和startCoroutine原理
详细版可参考《深入理解Kotlin协程》第三章。
2.协程是如何描述的?
协程是通过Job去描述的。
基本上每启动一个协程就会产生对应的Job。
它提供了六种状态来表示协程的运行状态。
New: 创建
Active: 运行
Completing: 已经完成等待自身的子协程
Completed: 完成
Cancelling: 正在进行取消或者失败
Cancelled: 取消或失败
详细版可参考《深入理解Kotlin协程》第五章第二节。
参考链接:
Kotlin协程实现原理:CoroutineScope&Job
3.协程是如何与线程关联的?
可参考这篇:
Kotlin协程之Dispatchers原理
简单总结:
https://zhuanlan.zhihu.com/p/549348531
Dispatchers是协程框架中与线程交互的关键。底层会有不同的线程池,Dispatchers.Default、IO,协程任务来了的时候会封装成一个个的Runnable,丢到线程中执行,这些Runnable的run方法中执行的其实就是continuation.resume,也就是launch的Lambda生成的SuspendLambda匿名内部类,也就是开启协程状态机,开始协程的真正执行。
4.协程是怎么切换线程的?
简单总结:CoroutineContext 里存放着协程的分发器。CoroutineDispatcher决定了运行在哪个线程上。
详细可参考这几篇:
Kotlin 协程源码解析
Kotlin 协程调度切换线程是时候解开真相了
5.协程执行、挂起、恢复的流程
