为何在此场景下称协程为父协程与子协程?是否存在层级关系?
Kotlin协程父协程与层级关系解析
“父协程”是不是指第一个启动的协程?
在这个示例里,runBlocking启动的协程既是第一个启动的协程,也是另外两个协程的父协程,但“父协程”的核心定义不是「启动顺序第一」,而是能启动其他协程的协程。只要一个协程是在另一个协程的上下文里通过launch/async等方式启动的,启动它的那个协程就是它的父协程。另外两个协程是否被包含在第一个协程中?二者有没有层级关系?
是的,这两个launch启动的协程是第一个协程的子协程,它们和父协程存在明确的层级绑定关系:- 生命周期绑定:父协程结束时,所有未完成的子协程会被自动取消;
- 等待机制:父协程会等待所有直接子协程执行完毕后才会结束(比如示例中
runBlocking的协程会等两个子协程都跑完才退出main函数); - 上下文继承:子协程默认会继承父协程的上下文参数(比如调度器、异常处理规则等)。
你可能觉得它们是“独立”的,是因为子协程可以和父协程并发执行,但本质上它们属于父协程的子层级,并非完全独立。
翻译后的示例代码
private var zeroTime = System.currentTimeMillis() fun log(message: Any?) { println("${System.currentTimeMillis() - zeroTime}" + "[${Thread.currentThread().name}] $message") } fun main() = runBlocking { log("第一个(父)协程启动") launch { log("第二个协程启动,准备挂起") delay(100.milliseconds) log("第二个协程恢复执行") } launch { log("第三个协程可以同时运行") } log("第一个协程已启动另外两个协程") }
内容的提问来源于stack exchange,提问作者Ken Kiarie
相关产品推荐
相关产品推荐

