协程Dispatchers(线程池中执行协程)
用了快一年的kotlin了,一直对协程中的各种Dispatchers
没有一个详细的了解。
本篇文章将讲解下面5种Dispatchers
- Dispatchers.IO
- Dispatchers.Unconfined
- Dispatchers.Main
- Dispatchers.Default
- 在自建线程池中执行协程
Dispatchers.IO
internal object DefaultScheduler : ExperimentalCoroutineDispatcher() { |
IO本质上也是一个线程池,这是一个kotlin内部的共享线程池,线程池大小受到kotlinx.coroutines.io.parallelism
文件的限制
1、如果kotlinx.coroutines.io.parallelism
没有配置线程数量,则IO线程池的大小至少是64,如果你的核心数大于64,则IO的线程池数量为核心数。
2、如果kotlinx.coroutines.io.parallelism
已经配置了线程数量,则IO线程池大小为kotlinx.coroutines.io.parallelism
配置的线程数
如何修改默认的IO线程数量:
默认情况下,该配置是为空的。
kotlinx.coroutines.io.parallelism
本质上是JVM的一个系统配置参数,因此可以通过System.setProperty(IO_PARALLELISM_PROPERTY_NAME, Integer.toString(1000));
修改线程数量
Dispatchers.Unconfined
非受限制调度器
第一个特性:
withContext(Dispatchers.Unconfined) { |
输出:”1 2 3” 或 “1 3 2”,最终输出”Done”
如果在一个runBlocking
周期内,切换的都是Dispatchers.Unconfined
,那么后续代码的执行将是无序的。
第二个特性:
GlobalScope.launch { |
输出:
Unconfined: I'm working in thread DefaultDispatcher-worker-1 |
1、在一个runBlocking
区间内,切换线程后,后续的代码依然会在该线程中执行,直到下一次切换线程
2、在一个rubBlocking
区间内,如果没有切换线程,代码则在launch
所在的线程中执行,直到下一次切换线程
Dispatchers.Main
任务将在主线程中执行
Dispatchers.Default
默认的线程池,也就是Dispatchers.IO
在自建线程池中执行协程
GlobalScope.launch(Executors.newSingleThreadExecutor().asCoroutineDispatcher()){ |
原文作者: AriaLyy
原文链接: https://www.laoyuyu.me/2021/02/04/kotlin/kotlin_coroutine_dispatchers/
版权声明: 本网站所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!