gpt4 book ai didi

kotlin - GlobalScope.launch 是创建一个新线程还是在同一线程中运行?

转载 作者:行者123 更新时间:2023-12-02 12:42:26 28 4
gpt4 key购买 nike

我有这个代码的问题。

https://kotlinlang.org/docs/reference/coroutines/basics.html

fun main() {
GlobalScope.launch { // launch new coroutine in background and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("World!") // print after delay
}
println("Hello,") // main thread continues while coroutine is delayed
Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

我用 Thread.sleep(1000L) 替换了 delay(1000L)。如果 GlobalScope.launch 块将在同一线程中运行,则 Thread.sleep(1000L) 将阻止该线程。不过好像不是。
fun main() {
GlobalScope.launch { // launch new coroutine in background and continue
Thread.sleep(1000L)
println("World!")
}
println("Hello,") //
Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

最佳答案

GlobalScope允许您启动或多或少与 daemon threads 具有相同行为的协程因为它们与任何协程分离 - Job并且基本上只要应用程序就可以运行。它们的生命周期仅受应用程序本身的限制。这是您希望通过使用“structured concurrency”避免的事情,这基本上意味着您的协程应该以一种您可以控制它们的方式嵌套,而无需手动跟踪它们的引用并加入它们,例如以等待它们的计算。所以在你的实际代码中你应该避免 GlobalScope尽可能多,因为肯定有更好的解决方案。

至于你的问题,正如已经提到的,GlobalScopeDispatchers.Default 上运行pool,这意味着您将阻塞某个工作线程,而不是您从中产生协程的那个。

另一方面,如果您要编写此块:

fun main() {
runBlocking {
Thread.sleep(1000L)
println("World!")
}
println("Hello,")
Thread.sleep(2000L)
}

你会看到协程阻塞了 main线程,输出将显示不同的结果。那是因为 runBlocking在调用者线程上运行 main而不是工作池线程之一。

关于kotlin - GlobalScope.launch 是创建一个新线程还是在同一线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55347302/

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