• 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. }
  • 相关阅读:
    dayjs初体验
    【自然语言处理-二-attention注意力 是什么】
    一键重装win7系统详细教程
    java面试总结笔记
    数据结构系列-堆排序
    布隆过滤器(Bloom Filter)从入门到出土
    建模杂谈系列153 程序的集成与自动化
    ThingsBoard如何自定义tcp-transport
    react-router-dom 版本6.18.0中NavLink的api和属性介绍
    React(一)
  • 原文地址:https://blog.csdn.net/HugMua/article/details/126125533