Kotlin的runBlocking协程应该阻塞当前线程,直到该块内的协程完成执行为止,但是当该块内的协程是GlobalScope.launch
时,似乎并没有这样做。我试图了解Kotlin的协同程序的工作方式,并在此处阅读文档-https://kotlinlang.org/docs/reference/coroutines/basics.html
在示例中-
fun main() = runBlocking<Unit> { // start main coroutine
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L)
println("World!")
}
println("Hello,") // main coroutine continues here immediately
delay(2000L) // delaying for 2 seconds to keep JVM alive
}
提到“调用runBlocking的主线程将阻塞,直到runBlocking内部的协程完成为止”。如果是这样,那么为什么我们需要两秒钟的延迟时间才能在runBlocking结束时阻塞主线程?为什么在GlobalScope.launch完成之前runBlocking不会阻塞主线程?
但是,以下内部runBlocking会阻塞主线程,直到延迟功能完成。这有什么区别?为什么直到GlobalScope.launch以类似的方式完成后,才在上述块主线程中不运行runBlocking-
fun main(){ // start main coroutine
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L)
println("World!")
}
println("Hello,") // main coroutine continues here immediately
runBlocking{
delay(2000L) // delaying for 2 seconds to keep JVM alive
}
}
我希望当将main函数包装在runBlocking协同例程中时,应阻塞主线程,直到GlobalScope.launch完成其执行为止。
答案 0 :(得分:1)
范围内的协程将阻塞,直到它在同一范围内的所有子级(job
s)完成为止。但是,在其他范围内明确发起协程并不会使它们成为真正的孩子,因此就没有等待他们了。
本文还提供了有关此特殊情况的一些信息:https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc