kotlin - 为什么这些协程没有给出预期的输出?
问题描述
我试图理解 Kotlin 中的协程,但我遇到了一些障碍。在以下示例中,我希望会发生以下情况:
- 打印 0
- 设置作业 1
- 设置作业 2
- 打印 3
- 运行作业 1
- 等待 1.2 秒
- 打印 1
- 打印 4
- 运行作业 2
- 等待 1 秒
- 打印 2
- 打印 5
- 打印 6
但它会打印:
0
3
2
1
4
5
6
我真的不明白为什么会这样。我大多不明白job2
can before 的输出是如何出现的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
- enter
runBlocking
,它阻塞当前线程,直到阻塞完成。 - 设置和启动 作业1;作业立即开始执行,并被延迟语句暂停 1200 毫秒。
- 设置和启动job2;该作业立即开始执行,并通过延迟语句暂停1000m。
- 打印 3
- 等待(暂停执行)直到作业 1 完成(
job.join()
)。 - 1000 毫秒后 job2打印 2并完成
- 1200 毫秒后 job1打印 1并完成
- 打印 4(因为作业 1 已完成)
- 等待(暂停执行)直到 job2 完成(
job2.join()
)。这会立即返回,因为 job2 已经完成。 - 打印 5
- print 6,在runBlocking -block完成并且启动它的线程继续之后。
您可以阅读https://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html以更好地了解挂起函数。帮助我理解协程的是这段视频:https ://www.youtube.com/watch?v=_hfBv0a09Jc
推荐阅读
- python - 如何在不使用 numpy 的情况下将数据提取到二维数组中
- node.js - Nextjs 项目在本地突然停止工作
- node.js - 我可以对几个端点使用一个后端请求吗?
- c# - HTML 附加字符串
- html - 使用引导程序使用 col- 和 flexbox 左对齐列
- flutter - 当我尝试注入依赖项时,出现了一个错误,上面写着 Failed assertion: line 315 pos 7: 'instanceFactory != null'
- c# - JSON 值无法转换为 System.Int64
- regex - 使用正则表达式查找以 S 以外的任何字母开头的名字
- html - 在父页面的新标签中打开 iframe 的链接
- java - 如何设置 AWS 警报以重新启动应用程序服务器