我们先从 Dispatchers.IO 开始,先来看看相关源码,对其有一个基本认知:
// Dispachers
public val IO: CoroutineDispatcher = DefaultIoScheduler
// DefaultIoScheduler
internal object DefaultIoScheduler : ExecutorCoroutineDispatcher(), Executor {
// 1. dispatcher
private val default: CoroutineDispatcher = UnlimitedIoScheduler.limitedParallelism(
systemProp(
IO_PARALLELISM_PROPERTY_NAME,
64.coerceAtLeast(AVAILABLE_PROCESSORS) // 1.1. 64
)
)
// 2 Executor.execute
override fun execute(command: java.lang.Runnable) = dispatch(EmptyCoroutineContext, command)
// 3 Dispatcher.dispatch
override fun dispatch(context: CoroutineContext, block: Runnable) {
default.dispatch(context, block)
}
}
Dispatcher.IO 的源码最终深入到了 LimitedDispatcher,LimitedDispatcher 的 dispatchInternal 是 dispatch 调用的方法,首先在 4.1 把任务加到 dispatcher 的队列中,然后 4.2 检查 worker(个人觉得这个命名不好,这里的worker不是线程,类似于不会阻塞的 EventLooper,运行期间会占用一个线程) 的数量是否达到传入的上限,没有就会在内部去检查是否任务已经堆积,如果已经堆积了就增加一个 worker 并启动,真正工作的线程也是一个 Worker,在 CoroutineScheduler 里面