【问题标题】:how many threads are created by multiple coroutines in kotlinkotlin中的多个协程创建了多少个线程
【发布时间】:2021-06-01 19:55:10
【问题描述】:

我创建了一个简单的程序,在其中我使用 GlobalScope.launch 启动了 3 个协程 全部打印 100 行代码的进度,协程 1 在执行完成一半时调用挂起函数。

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

fun main(){
    println("Actual Program starts here : ${Thread.currentThread().name}")

    GlobalScope.launch {
        println("C1 starts here : ${Thread.currentThread().name}")
        for(i in 1..100){
            if(i == 50){
                mfunction()
            }
            println("C1 progress  = $i : ${Thread.currentThread().name}")
        }
        println("C1 Ends here : ${Thread.currentThread().name}")
    }

    GlobalScope.launch {
        println("C2 starts here : ${Thread.currentThread().name}")
        for(i in 1..100){
            println("C2 progress  = $i : ${Thread.currentThread().name}")
        }
        println("C2 Ends here : ${Thread.currentThread().name}")
    }

    GlobalScope.launch {
        println("C3 starts here : ${Thread.currentThread().name}")
        for(i in 1..100){
            println("C3 progress  = $i : ${Thread.currentThread().name}")
        }
        println("C3 Ends here : ${Thread.currentThread().name}")
    }

    for(i in 1..100){
        println("Actual Work progress  = $i : ${Thread.currentThread().name}")
    }
    println("Actual Program Ends here : ${Thread.currentThread().name}")
}

suspend fun mfunction(){
    for(i in 1..100){
        println("Suspend Work progress  = $i : ${Thread.currentThread().name}")
    }
}

因为默认情况下主线程在那里。我的问题是,每个协程是否会创建一个新线程(为其执行)以在其上运行,或者它们都将在单个后台线程上运行??

我执行了这个程序, 我为 Coroutine1 获得 DefaultDispatcher-worker1,为 Coroutine2 获得 DefaultDispatcher-worker2,为 Coroutine3 获得 DefaultDispatcher-worker3 但有时我为所有协程获得 DefaultDispatcher-worker1。

我无法弄清楚内部发生的行为。 提前致谢。

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案1】:

    线程数取决于使用的调度程序以及您的代码的作用。 Dispatchers.Default(您在此处使用)可以创建的最大线程数等于您拥有的物理内核数。如果您要创建例如4 核 CPU 上的 5 个协程,然后在其中一个完成后启动第五个协程。

    但是,上述情况是正确的,只是因为您的代码是 CPU 密集型的,而且它根本不会挂起。如果您不是通过繁忙的循环等待,而是通过delay() 等待,那么您甚至可以在单个线程上运行数千个协程。

    协程也可以从一个线程切换到另一个线程。您可以在某个线程中启动协程,在暂停点之后它可以在另一个线程中继续。

    【讨论】:

      【解决方案2】:

      每个协程会创建一个新线程

      协程不创建线程。他们使用一些thread pool 的现有线程,CoroutineDispatcher 你在上面运行你的 couroutines(Dispatchers.Default 在你的情况下)指向。提交的任务在线程上的分布取决于尊重线程池的内部实现。

      【讨论】:

        猜你喜欢
        • 2015-12-06
        • 2010-12-19
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2010-12-26
        • 2013-11-01
        • 1970-01-01
        • 2023-02-11
        相关资源
        最近更新 更多