作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个代码的问题。
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
}
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
尽可能多,因为肯定有更好的解决方案。
至于你的问题,正如已经提到的,GlobalScope
在 Dispatchers.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/
我是一名优秀的程序员,十分优秀!