为什么这段代码永远不会打印 Hello World?
runBlocking(Dispatchers.Main) {
launch {
delay(1)
println("Hello world")
}
}
但这会打印runBlocking {
launch {
delay(1)
println("Hello world")
}
}
最佳答案
从我看到的第一个示例中可以完全卡住应用程序(在按钮单击监听器中使用时)。
问题是你造成了僵局:
Dispatchers.Main
通过向主应用程序循环程序 runBlocking
阻塞主应用线程 runBlocking
完成 您可以通过使用
Dispatchers.Main.immediate
来稍微缓解“问题”,而 launch
是基础调度程序的一个更智能的版本 - 如果它已经在主线程上运行并就地执行,它不会将协程发布到主循环程序。这将允许您运行
delay
块,但是 runBlocking
将再次发布协程以继续主循环程序并导致另一个死锁。第二个代码示例没有问题,因为在那里运行的协程不与主线程交互(除了 ojit_code it)。
关于android - 为什么 kotlin 协程会阻塞这段代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63361989/