第089篇 调度器 Dispatchers:三兄弟的分工 调度器这题很容易被答成"有 IO、Default、Main 三个"——那是及格线。真正能接住层层递进追问的答法,是知道每个调度器背后是哪个线程池、并行度怎么算、切换的代价是什么、以及 Main 不是立即执行。这四个点串起来,协程的性能问题就都能解释了。先把结论放在前面:调度器回答的是"协程在哪个线程上跑"。Dispatchers.Main(Android 上是主线程 Looper)、Dispatchers.Default(CPU 密集,共享线程池,并行度 = 核心数)、Dispatchers.IO(IO 密集,共享线程池但并行度更大,默认 64 或最多核数×2)、Dispatchers.Unconfined(不切换,立即在当前线程执行)、Dispatchers.Main.immediate(在已是主线程时立即执行、否则走 post)。记住"Io 和 Default 共用一个线程池"这个事实——它是很多困惑的来源。机制拆解先说"IO 和 Default 共享线程池"这件事。Kotlin 协程的 IO 与 Default 底层是同一个CoroutineScheduler与线程池,区别只在并行度上限:Default 的上限是 CPU 核心数,IO 的上限是 64(或核心数与