(Kotlin协程十二)当一个父协程被取消时,它的子协程会怎样?

当一个父协程被取消时,它的子协程的命运完全遵循结构化并发的原则。简单来说,就是父协程的取消会立即传播到所有其直接和间接的子协程。但这只是故事的开始,其背后的传播机制、异常处理以及如何打破这一规则,才是深入理解的关键。”


核心答案:取消的传播

当一个父协程被取消(例如调用 job.cancel())时:

  1. 父协程立即进入 Cancelling 状态

  2. 取消原因会作为一个 CancellationException 向下传播给所有子协程

  3. 所有子协程也会被依次取消。这意味着,父协程会等待所有子协程完成它们的取消逻辑后,自己才会进入 Cancelled 状态。

  4. 一旦父协程被取消,任何试图在该作用域内启动新协程的操作(如调用 launch)都会立即失败


深入原理与场景分析

1. 机制:协作式取消

协程的取消是 协作式 的。这意味着取消请求更像是一个信号,而非强制中断。子协程必须检查取消状态并做出响应。

  • 自动检查的挂起函数:所有 Kotlin 协程库中的挂起函数(如 delay()withContext()join() 等)都是 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值