Koltin协程——Dispatcher.IO的实现原理

阅读 7

2024-12-02

我们先从 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 里面


精彩评论(0)

0 0 举报