You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在此场景下称协程为父协程与子协程?是否存在层级关系?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:32:43