协程进阶:01. 基本取消操作

本篇解析 example-cancel-01.kt,介绍如何手动停止一个正在运行的协程。

1. 核心操作

  • **job.cancel()**:请求取消协程。它会发送一个取消信号,但协程不会立即“死去”。
  • **job.join()**:挂起当前线程/协程,直到目标协程彻底结束。
  • **job.cancelAndJoin()**:上述两个操作的组合快捷函数。

2. 为什么能取消?

在这个例子中,协程内部调用了 delay()

  • delay 是一个可取消的挂起函数
  • 当它检测到取消信号时,会抛出 CancellationException,从而中断协程。

3. 执行流程

  1. 启动协程打印 “sleeping…”。
  2. 主线程延迟 1.3 秒。
  3. 调用 cancel()
  4. 协程在下一个 delay 处检测到信号,停止执行。
  5. 打印 “Now I can quit.”。
,