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

标签 kotlin kotlin-coroutines

我有这个代码的问题。

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/

相关文章:

kotlin - 如何在 Kotlin 中匿名传递委托(delegate)属性?

android - 无法从 ViewModel 向用户显示协程错误消息

asynchronous - Kotlin:将 "normal"函数转换为阻塞挂起函数对性能有何影响?

kotlin - Aspectj 不适用于 kotlin

gradle - 更改 KAPT 类生成路径

android - MVP Presenter 未正确注入(inject)

kotlin - 即使从 androidx.room.Room 导入后,Room.databaseBuilder() 也找不到 Room 依赖项

kotlin - 为什么作者需要用 viewModelScope.launch 包装一个非挂起函数?

android - 挂起函数只能在协程体内调用

android - 同时调用多个 API 并在相应请求的处理完成后立即更新 UI Android