• Kotlin - 协程调度器 CoroutineDispatcher


    • 是一个抽象类,Dispatcher是一个标准库中帮我们封装了切换线程的帮助类,可以调度协程在哪类线程上执行。
    • 由于子协程会继承父协程的上下文,在父协程上指定调度器模式后子协程默认使用这个模式。
    • IO 和 DEFAULT 模式共享同一线程池,优化线程被重用,线程数量限制相互独立不会让对方饥饿。最大限度一起使用的话,默认同时活跃的线程数为 64+CPU数。
    Dispatcher.Main运行于主线程,在 Android 中就是 UI 线程,用来处理一些 UI 交互的轻量级任务。

    调用 suspend 函数

    调用 UI 函数

    更新 LiveData

    Dispatcher.IO

    运行于线程池,专为阻塞任务进行了优化。

    默认限制可同时活跃的线程数 ≤ 64

    数据库

    文件读写

    网络处理

    Dispatcher.Default

    运行于线程池,专为CPU密集型计算任务进行了优化。

    2 ≤ 线程数 ≤ CPU数量

    数组排序

    Json解析

    处理差异判断

    Dispatcher.Unconfined不改变线程,在启动它的线程执行,在恢复它的线程执行。当不需要关心协程在哪个线程上被挂起时使用。

    Kotlin 1.6版本

    limitedParallelism()

    public open fun limitedParallelism(parallelism: Int): CoroutineDispatcher
    Default模式:当有一个开销很大的任务,可能会导致其它使用相同调度器的协程抢不到线程执行权,这个时候就可以用来限制该协程的线程使用数量。
    IO模式:当有一个开销很大的任务,可能会导致阻塞太多线程让其它任务暂停等待,突破默认64个线程的限制加速执行。
    限制为1,解决多线程修改数据的同步问题。
    1. suspend fun main(): Unit = coroutineScope {
    2. //使用默认IO模式
    3. launch {
    4. printTime(Dispatchers.IO) //打印:Dispatchers.IO 花费了: 2038/
    5. }
    6. //使用limitedParallelism增加线程
    7. launch {
    8. val dispatcher = Dispatchers.IO.limitedParallelism(100)
    9. printTime(dispatcher) /打印:LimitedDispatcher@1cc12797 花费了: 1037
    10. }
    11. }
    12. suspend fun printTime(dispatcher: CoroutineDispatcher) {
    13. val time = measureTimeMillis {
    14. coroutineScope {
    15. repeat(100) {
    16. launch(dispatcher) {
    17. Thread.sleep(1000)
    18. }
    19. }
    20. }
    21. }
    22. println("$dispatcher 花费了: $time")
    23. }
  • 相关阅读:
    [转]MySQL索引底层实现原理(此文个人觉得非常好收藏一下)
    OpenCV提取十字标中心点的几种思路
    C++11新特性(lambda,可变参数模板,包装器,bind)
    Ant-design-vue Table 列表 columns 将作为导出功能入参
    USACO Training 1.5 Number Triangles
    深入解析Flutter下一代渲染引擎Impeller
    Apinto 网关进阶教程,使用 API Mock 生成模拟数据
    浏览器cookie怎么清除,彻底清除上网痕迹只需这几步
    服务器配置openvpn,ssh连接断开
    细说MySQL数据类型
  • 原文地址:https://blog.csdn.net/HugMua/article/details/126125533