协程进阶:上下文 02. 非受限调度器 (Dispatchers.Unconfined)

本篇解析 example-context-02.kt。探讨一种特殊的调度器行为。

1. 核心概念:Dispatchers.Unconfined

Dispatchers.Unconfined 是一个非受限的调度器。

特点:

  • 立即执行:协程在调用者的线程中立即开始执行。
  • 恢复位置不确定:当协程遇到第一个挂起点并恢复后,它会在恢复它的挂起点的线程上继续执行。
  • 不建议用于普通业务:它不适合一般的异步任务,因为它可能会导致某些逻辑在不可预知的线程(如执行 delay 的共享线程池)中运行。

2. 代码解析

1
2
3
4
5
launch(Dispatchers.Unconfined) { 
println("Unconfined : I'm working in thread ${Thread.currentThread().name}")
delay(500)
println("Unconfined : After delay in thread ${Thread.currentThread().name}")
}
  • 执行逻辑
    1. 开始时在 main 线程运行。
    2. delay 结束后,可能在 kotlinx.coroutines.DefaultExecutor 线程中恢复。

3. 开发者感悟

Unconfined 主要用于某些对性能极其敏感且不需要切换线程开销的边缘场景。在 Android 实际开发中,应优先选择 DefaultIOMain,以保证线程的可预测性。

,