kotlin中的多个协程创建了多少线程

kotlin中的多个协程创建了多少线程,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我创建了一个简单的程序,使用GlobalScope.launch启动了3个协同程序 coroutine 1打印了100行的进程代码,当一半的执行完成时,它调用了一个suspend函数 import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch fun main(){ println("Actual Program starts here : ${Thread.currentThread().na

我创建了一个简单的程序,使用GlobalScope.launch启动了3个协同程序 coroutine 1打印了100行的进程代码,当一半的执行完成时,它调用了一个suspend函数

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}")
    }
}
因为默认情况下主线程在那里。我的问题是,每个协同程序是否会创建一个新的线程(用于执行),以便在其上运行,或者它们都将在单个后台线程上运行

我执行了这个程序, 我为协程1获取DefaultDispatcher-worker1,为协程2获取DefaultDispatcher-worker2,为协程3获取DefaultDispatcher-worker3,但有时为所有协程获取DefaultDispatcher-worker1

我无法理解内部正在发生的行为。
提前感谢。

线程的数量取决于使用了哪个调度程序以及代码的功能。
分派器可以创建的最大线程数。默认值(此处使用)等于您拥有的物理内核数。如果您要在4核CPU上创建例如5个协程,那么第五个协程将在其中一个完成后启动

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

协同程序还可以从一个线程切换到另一个线程。您可以在某个线程中启动协同程序,在挂起点之后,它可以在另一个线程中继续

每个协同程序是否会创建一个新线程

协同程序不创建线程。它们使用一些现有线程,这些线程
CoroutineDispatcher
您运行(在您的例子中)例程所指向的线程。提交的任务在线程上的分布取决于尊重线程池的内部实现