本篇解析 example-cancel-02.kt,探讨为什么有些协程在调用 cancel 后依然继续运行。
1. 核心现象
在这个例子中,协程执行的是一个纯 CPU 计算的 while 循环。
- 结果:即使主线程调用了
job.cancelAndJoin(),协程依然会完整跑完 5 次循环打印,直到任务自行结束。
2. 为什么取消失效?
协程的取消是协作式的。
- 如果协程内部没有调用任何“挂起函数”(如
delay),或者没有手动检查“取消状态”,它就无法感知外部的取消请求。 - 传统的
while (i < 5)循环是阻塞式的 CPU 操作,它会一直霸占执行权。
3. 开发者感悟
协程不是线程的强制终止(Thread.stop),它更像是一种“请假”机制。如果你不看手机(不检查取消状态),你就不知道假被取消了。在处理密集型计算任务时,必须考虑到这一点。