runBlocking Coroutine不会阻止GlobalScope.launch(?)

时间:2019-04-06 16:46:07

标签: kotlin kotlin-coroutines

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完成其执行为止。

1 个答案:

答案 0 :(得分:1)

范围内的协程将阻塞,直到它在同一范围内的所有子级(job s)完成为止。但是,在其他范围内明确发起协程并不会使它们成为真正的孩子,因此就没有等待他们了。

本文还提供了有关此特殊情况的一些信息:https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc