从the documentation of runBlocking
可以清楚地看出,为什么从协程中使用它(例如将其嵌套)没有意义。
它甚至明确指出:
但是,可以这样做:
fun main(args: Array<String>) {
runBlocking {
runBlocking {
println("hi")
}
}
}
(IntelliJ)IDE有点提示
但是代码可以编译并运行。
如果在更复杂的环境中意外完成,会发生什么?崩溃了吗?还是死锁?
最佳答案
不,不是那样的。实际上,runBlocking
是专门为支持嵌套而编写的:
您提到的问题实际上与嵌套runBlocking
调用无关,而是从协程调用任何阻塞代码的总体问题。我们使用协程的特定目的是避免阻塞线程,因此在其中调用阻塞函数通常是错误的。对于Thread.sleep()
,java.io
调用等,您也会收到相同的警告。