我试图了解Kotlin中的协程,但遇到了一些障碍。在下面的示例中,我希望发生以下情况:
但是它打印出:
0
3
2
1
4
5
6
我真的不明白为什么会这样。我大多不了解job2
的输出会比4
早。我很困惑。
println("0")
runBlocking {
val job = GlobalScope.launch {
// launch new coroutine and keep a reference to its Job
delay(1200L)
println("1")
}
val job2 = GlobalScope.launch {
// launch new coroutine and keep a reference to its Job
delay(1000L)
println("2")
}
println("3")
job.join() // wait until child coroutine completes
println("4")
job2.join() // wait until child coroutine
println("5")
}
println("6")
答案 0 :(得分:3)
从documentation of kotlinx.coroutines#launch中读取内容:
默认情况下,协程将立即安排执行。其他启动选项可以通过启动参数指定。有关详细信息,请参见CoroutineStart。可以将可选的启动参数设置为CoroutineStart.LAZY以延迟启动协程。在这种情况下,协程作业将以新状态创建。可以使用start函数显式启动它,并将在首次调用join时隐式启动。
因此,您的协程在launch
命令之后立即开始。这应该说明已执行命令的顺序。异步协程中的delay
立即执行,而主线程执行下一条语句。 {{1}之前的3
之前的2
。然后,您要等到第一项工作完成(打印1
)之后,再从主线程打印1
。
如果您希望按期望的方式执行代码,可以将4
参数添加到start = CoroutineStart.LAZY
中,如下所示:
launch
答案 1 :(得分:3)
会发生什么:
runBlocking
,它将阻塞当前线程,直到阻塞完成。job.join()
)。job2.join()
)。立即返回,因为job2已经完成。您可以阅读https://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html,以更好地了解暂停功能。这段视频帮助我了解了协程:https://www.youtube.com/watch?v=_hfBv0a09Jc