gpt4 book ai didi

kotlin - runBlocking 协程不会阻止 GlobalScope.launch (?)

转载 作者:行者123 更新时间:2023-12-03 20:57:02 34 4
gpt4 key购买 nike

Kotlin 的 runBlocking Coroutine 应该阻塞当前线程,直到块内的 Coroutine 完成执行,但是当块内的 Coroutine 是 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 以类似方式完成之前,为什么不在上述阻塞主线程中运行阻塞 -
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
}
}

我希望当主函数被包装在一个 runBlocking 协程中时,主线程应该被阻塞,直到 GlobalScope.launch 完成它的执行。

最佳答案

作用域中的协程将阻塞,直到它在同一作用域中的所有子进程( job )都完成。然而,明确地在另一个范围内启动协程不会使它们成为真正的 child ,因此它们不会被等待。

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

关于kotlin - runBlocking 协程不会阻止 GlobalScope.launch (?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55551255/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com