为何指定Dispatchers.IO仍显示DefaultDispatcher-worker线程?线程数为何过多?
Kotlin协程调度器两个问题的解答
问题1:Dispatchers.IO的线程名为何显示为DefaultDispatcher-worker-xx?
Kotlin协程的Dispatchers.IO与Dispatchers.Default底层共用同一个线程池实例,只是配置了不同的线程调度参数。这个共享线程池的名称就是DefaultDispatcher,所以不管你使用哪个调度器,线程名都会以它开头。
你指定Dispatchers.IO后,协程确实会运行在符合IO调度器规则的线程中——IO调度器核心线程数等于CPU核心数,最大线程数为64与CPU核心数2倍的较大值,会根据任务量动态扩容线程。线程名的前缀不代表调度器类型,不用纠结这个标识。
问题2:线程数为何远超CPU核心数?
你搞混了两个调度器的线程限制规则:
- 官方文档说的“默认最大线程数等于CPU核心数(至少2)”是针对
Dispatchers.Default的,它是为CPU密集型任务设计的,线程数过多反而会因为上下文切换降低效率。 - 而
Dispatchers.IO是为IO密集型任务设计的,这类任务大部分时间在等待IO操作,所以可以容纳更多线程。它的最大线程数规则是取64和CPU核心数2倍中的较大值。你的笔记本有10个核心,2倍是20,小于64,所以IO调度器最大支持64个线程。你一次性启动了50个IO协程,这些协程在执行println时还没进入挂起状态,线程池会直接扩容到足够的线程来处理,因此日志里会出现约50个不同的worker线程。
内容的提问来源于stack exchange,提问作者visiblesail
相关产品推荐
相关产品推荐

