the documentation of runBlocking 可以清楚地看出,为什么从协程中使用它(例如将其嵌套)没有意义。

它甚至明确指出:



但是,可以这样做:

fun main(args: Array<String>) {
    runBlocking {
        runBlocking {
            println("hi")
        }
    }
}

(IntelliJ)IDE有点提示

但是代码可以编译并运行。

如果在更复杂的环境中意外完成,会发生什么?崩溃了吗?还是死锁?

最佳答案



不,不是那样的。实际上,runBlocking是专门为支持嵌套而编写的:



您提到的问题实际上与嵌套runBlocking调用无关,而是从协程调用任何阻塞代码的总体问题。我们使用协程的特定目的是避免阻塞线程,因此在其中调用阻塞函数通常是错误的。对于Thread.sleep()java.io调用等,您也会收到相同的警告。

10-04 13:17