我正在用文档和一些例子学习协同程序测试一些例子,我发现在同一个协同程序范围内它是按顺序工作例如下面代码是按顺序工作
fun main() = runBlocking {
coroutineScope {
launch {
delay(1000)
println("Start")
}
}
coroutineScope {
launch {
delay(2000)
println("World2")
}
launch {
delay(1000)
println("World1")
}
println("Hello")
}
println("Done")
}
/*
Start
Hello
World1
World2
Done
*/
但是如果我这样改变上面的代码
fun main() = runBlocking {
launch {
delay(1000)
println("Start")
}
coroutineScope {
launch {
delay(2000)
println("World2")
}
launch {
delay(1000)
println("World1")
}
println("Hello")
}
println("Done")
}
/*
Hello
Start
World1
World2
Done
*/
删除第一个CoroutineScope,结果序列被改变。在我看来,我认为这是一个作业状态的问题,但不确定。有谁可以澄清这个问题吗?
1条答案
按热度按时间osh3o9ms1#
coroutineScope
会一直挂起直到它的所有子协程都执行完毕。在第一种情况下,coroutineScope
会一直等到launch
完成并输出Start
,这就是为什么在控制台上会看到Start
作为第一个输出。在第二部分中,我们删除了
coroutineScope
,所以现在它只是启动了一个新的协程并进入下一步(launch
不会挂起)。然后在coroutineScope
中,您启动了另外两个协程(使用launch
)并打印Hello
。这就是为什么Hello
首先被打印。所有其他的打印语句都在等待延迟完成。1秒后,第一个
launch
完成并打印Start
,然后是World1
和World2
。现在,当这个coroutineScope
完成时,程序控制移到最后一个print语句并打印Done
。