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

时间:2021-06-01 19:55:10

标签: kotlin kotlin-coroutines

我创建了一个简单的程序,在其中使用 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。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

<块引用>

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

协程不创建线程。它们使用某些 thread pool 的现有线程,CoroutineDispatcher 您在其上运行协程(在您的情况下为 Dispatchers.Default)指向。线程上提交的任务分配取决于相互尊重的线程池的内部实现。

相关问题