协程进阶:02. 计算任务无法取消

本篇解析 example-cancel-02.kt,探讨为什么有些协程在调用 cancel 后依然继续运行。

1. 核心现象

在这个例子中,协程执行的是一个纯 CPU 计算的 while 循环。

  • 结果:即使主线程调用了 job.cancelAndJoin(),协程依然会完整跑完 5 次循环打印,直到任务自行结束。

2. 为什么取消失效?

协程的取消是协作式的。

  • 如果协程内部没有调用任何“挂起函数”(如 delay),或者没有手动检查“取消状态”,它就无法感知外部的取消请求。
  • 传统的 while (i < 5) 循环是阻塞式的 CPU 操作,它会一直霸占执行权。

3. 开发者感悟

协程不是线程的强制终止(Thread.stop),它更像是一种“请假”机制。如果你不看手机(不检查取消状态),你就不知道假被取消了。在处理密集型计算任务时,必须考虑到这一点。

,