我创建了一个简单的程序,在其中使用 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。
我无法弄清楚内部发生的行为。 提前致谢。
答案 0 :(得分:1)
线程数取决于使用了哪个调度程序以及您的代码做什么。 Dispatchers.Default
(您在此处使用)可以创建的最大线程数等于您拥有的物理内核数。如果你想创建例如4 核 CPU 上有 5 个协程,然后在其中一个完成后启动第五个协程。
但是,以上仅是因为您的代码是 CPU 密集型的,并且根本不会挂起。如果您不使用繁忙循环,而是通过 delay()
等待,那么您甚至可以在单个线程上运行数千个协程。
协程也可以从一个线程切换到另一个线程。您可以在某个线程中启动协程,在暂停点之后它可以在另一个线程中继续。
答案 1 :(得分:0)
每个协程会创建一个新线程
协程不创建线程。它们使用某些 thread pool 的现有线程,CoroutineDispatcher
您在其上运行协程(在您的情况下为 Dispatchers.Default)指向。线程上提交的任务分配取决于相互尊重的线程池的内部实现。