为什么这段代码永远不会打印 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/

    10-14 10:23