• 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. }
  • 相关阅读:
    Camunda 7.x 系列【49】存储服务 RepositoryService
    FRR+BFD+OSPF与BGP联动
    STM32超声波传感器
    【毕业设计】深度学习人脸识别系统 - python opencv 卷积神经网络
    淘宝/天猫获取购买到的商品订单物流信息 API分享
    【图像边缘检测】基于matlab灰度图像的积累加权边缘检测【含Matlab源码 2010期】
    前端程序员的职业规格
    java-php-python-远程教学系统录屏计算机毕业设计
    Python-入门-安装和运行(二)
    【高级程序设计】Week2-2 HTTP and Web
  • 原文地址:https://blog.csdn.net/HugMua/article/details/126125533