- 是一个抽象类,Dispatcher是一个标准库中帮我们封装了切换线程的帮助类,可以调度协程在哪类线程上执行。
- 由于子协程会继承父协程的上下文,在父协程上指定调度器模式后子协程默认使用这个模式。
- IO 和 DEFAULT 模式共享同一线程池,优化线程被重用,线程数量限制相互独立不会让对方饥饿。最大限度一起使用的话,默认同时活跃的线程数为 64+CPU数。
Dispatcher.Main | 运行于主线程,在 Android 中就是 UI 线程,用来处理一些 UI 交互的轻量级任务。 | 调用 suspend 函数 调用 UI 函数 更新 LiveData |
Dispatcher.IO | 运行于线程池,专为阻塞任务进行了优化。 默认限制可同时活跃的线程数 ≤ 64 | 数据库 文件读写 网络处理 |
Dispatcher.Default | 运行于线程池,专为CPU密集型计算任务进行了优化。 2 ≤ 线程数 ≤ CPU数量 | 数组排序 Json解析 处理差异判断 |
Dispatcher.Unconfined | 不改变线程,在启动它的线程执行,在恢复它的线程执行。 | 当不需要关心协程在哪个线程上被挂起时使用。 |
limitedParallelism() | public open fun limitedParallelism(parallelism: Int): CoroutineDispatcher |
Default模式:当有一个开销很大的任务,可能会导致其它使用相同调度器的协程抢不到线程执行权,这个时候就可以用来限制该协程的线程使用数量。 | |
IO模式:当有一个开销很大的任务,可能会导致阻塞太多线程让其它任务暂停等待,突破默认64个线程的限制加速执行。 | |
限制为1,解决多线程修改数据的同步问题。 |
- suspend fun main(): Unit = coroutineScope {
- //使用默认IO模式
- launch {
- printTime(Dispatchers.IO) //打印:Dispatchers.IO 花费了: 2038/
- }
- //使用limitedParallelism增加线程
- launch {
- val dispatcher = Dispatchers.IO.limitedParallelism(100)
- printTime(dispatcher) /打印:LimitedDispatcher@1cc12797 花费了: 1037
- }
- }
-
- suspend fun printTime(dispatcher: CoroutineDispatcher) {
- val time = measureTimeMillis {
- coroutineScope {
- repeat(100) {
- launch(dispatcher) {
- Thread.sleep(1000)
- }
- }
- }
- }
- println("$dispatcher 花费了: $time")
- }