use*_*721 6 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
}
Run Code Online (Sandbox Code Playgroud)
我用 Thread.sleep(1000L) 替换延迟(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
}
Run Code Online (Sandbox Code Playgroud)
它GlobalScope允许您启动协程,这些协程或多或少具有与守护线程相同的行为,因为它们与任何协程分离Job,并且基本上与应用程序一样运行。它们的生命周期仅受应用程序本身的限制。这是您希望通过使用“结构化并发”来避免的事情,这基本上意味着您的协程应该以一种您可以控制它们的方式嵌套,而无需手动跟踪它们的引用并加入它们,例如为了等待它们的计算。因此,在现实生活中的代码中,您应该GlobalScope尽可能避免,因为肯定有更好的解决方案。
至于你的问题,正如已经提到的,GlobalScope在池上运行Dispatchers.Default,这意味着你将阻止一些工作线程,但不会阻止你从中生成协程的线程。
另一方面,如果您要编写此块:
fun main() {
runBlocking {
Thread.sleep(1000L)
println("World!")
}
println("Hello,")
Thread.sleep(2000L)
}
Run Code Online (Sandbox Code Playgroud)
您将看到协程阻塞了main线程,并且输出将显示不同的结果。这是因为runBlocking在调用者线程main而不是工作池线程之一上运行。
| 归档时间: |
|
| 查看次数: |
4085 次 |
| 最近记录: |