在协程中使用 runBlocking 时会发生什么坏事吗?

Tob*_*ann 5 coroutine kotlin kotlin-coroutines

文档中runBlocking很清楚为什么从协程中使用它没有意义,例如嵌套它。

它甚至明确指出:

不应在协程中使用此函数。

但是,可以这样做:

fun main(args: Array<String>) {
    runBlocking {
        runBlocking {
            println("hi")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(IntelliJ) IDE 有点抱怨

视频

但代码编译并运行。

在更复杂的环境中意外完成会发生什么?崩溃?或者可能是死锁?

Mar*_*nik 3

在更复杂的环境中意外操作会发生什么?崩溃?或者也许是死锁?

不,没有那样的事。其实runBlocking是专门为了支持嵌套而写的:

如果指定的调度程序是另一个事件循环runBlocking,则此调用使用外部事件循环。

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