当一个父协程被取消时,它的子协程的命运完全遵循结构化并发的原则。简单来说,就是父协程的取消会立即传播到所有其直接和间接的子协程。但这只是故事的开始,其背后的传播机制、异常处理以及如何打破这一规则,才是深入理解的关键。”
核心答案:取消的传播
当一个父协程被取消(例如调用 job.cancel())时:
-
父协程立即进入
Cancelling状态。 -
取消原因会作为一个
CancellationException向下传播给所有子协程。 -
所有子协程也会被依次取消。这意味着,父协程会等待所有子协程完成它们的取消逻辑后,自己才会进入
Cancelled状态。 -
一旦父协程被取消,任何试图在该作用域内启动新协程的操作(如调用
launch)都会立即失败。
深入原理与场景分析
1. 机制:协作式取消
协程的取消是 协作式 的。这意味着取消请求更像是一个信号,而非强制中断。子协程必须检查取消状态并做出响应。
-
自动检查的挂起函数:所有 Kotlin 协程库中的挂起函数(如
delay(),withContext(),join()等)都是

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



