本篇解析 example-cancel-01.kt,介绍如何手动停止一个正在运行的协程。
1. 核心操作
- **job.cancel()**:请求取消协程。它会发送一个取消信号,但协程不会立即“死去”。
- **job.join()**:挂起当前线程/协程,直到目标协程彻底结束。
- **job.cancelAndJoin()**:上述两个操作的组合快捷函数。
2. 为什么能取消?
在这个例子中,协程内部调用了 delay()。
delay是一个可取消的挂起函数。- 当它检测到取消信号时,会抛出
CancellationException,从而中断协程。
3. 执行流程
- 启动协程打印 “sleeping…”。
- 主线程延迟 1.3 秒。
- 调用
cancel()。 - 协程在下一个
delay处检测到信号,停止执行。 - 打印 “Now I can quit.”。