【发布时间】:2020-11-08 23:05:39
【问题描述】:
我对 runBlocking() 和 coroutineScope() 感到困惑。我已经阅读了很多关于此的内容,但我仍然感到困惑。我知道 runBlocking() 会阻塞线程,而 coroutineScope() 会挂起协程,但我不清楚它的含义。
在此示例中,它先打印 A,然后打印 B。但是,runBlocking() 应该阻塞线程,直到它的所有代码完成。因此,当线程被 runBlocking() 阻塞时,不应打印 A。它应该先打印 B,然后再打印 A。
runBlocking {
launch {
delay(1000L)
println("A")
}
runBlocking {
delay(3000L)
println("B")
}
}
在其他代码中,它先打印 B,然后再打印 A。
runBlocking {
launch {
delay(1000L)
println("A")
}
runBlocking {
Thread.sleep(3000L)
println("B")
}
}
Thread.sleep() 确实阻塞了线程,线程被阻塞时无法打印A。
如果线程中的协程可以在线程被阻塞的情况下执行,那么使用runBlocking()阻塞线程是什么意思?
如果这段代码的行为与第一个相同,runBlocking() 和 coroutineScope() 有什么区别?
runBlocking {
launch {
delay(1000L)
println("A")
}
coroutineScope {
delay(3000L)
println("B")
}
}
【问题讨论】:
-
“runBlocking() 和 coroutineScope() 有什么区别?”,
runBlocking是创建新协程的普通函数,coroutineScope是创建新协程作用域的挂起函数。来自runBlockingdocs:此函数不应在协程中使用。 它旨在将常规阻塞代码连接到以挂起样式编写的库,用于主函数和在测试中。,只是不要那样使用它。
标签: multithreading kotlin coroutine kotlin-coroutines