Kotlin主函数中的协程执行delay后是如何恢复运行的?
Kotlin 纯main函数场景下协程delay恢复执行逻辑
核心依赖Kotlin协程JVM实现的内置调度器、延迟任务队列实现,和Android平台的调度逻辑完全独立,具体流程如下:
- 首先明确main函数的协程运行环境:你在main函数中启动协程通常有两种写法,要么是用
runBlocking包裹协程代码,要么是直接用Kotlin 1.3+支持的suspend fun main,两种场景都会初始化对应调度器的任务队列:runBlocking场景下会在当前main线程绑定专属的事件循环任务队列,阻塞main线程直到内部所有协程执行完成suspend fun main默认使用Dispatchers.Default线程池调度器,内部自带全局任务队列
- 协程执行
delay时的挂起逻辑:- 调用
delay方法后,当前协程立刻挂起,让出执行权 - 调度器会把当前协程的续体(Continuation,封装了协程后续要执行的代码逻辑)和指定的延迟时间绑定,封装为延迟任务存入对应的延迟队列
- 调用
- 延迟到期后的恢复逻辑:
- 调度器内部的定时检查逻辑会轮询所有延迟任务,当对应任务的延迟时间到期后,会把任务从延迟队列移动到可执行队列
- 调度器的工作线程(
runBlocking场景下就是被阻塞的main线程,Dispatchers.Default场景下是线程池的空闲工作线程)会取出该任务,调用续体的resume方法 - 续体恢复后触发协程状态机执行下一个状态的代码,也就是你写在
delay之后的逻辑,完成协程的恢复执行
内容的提问来源于stack exchange,提问作者Nikhil kumar
相关产品推荐
相关产品推荐

