告诉我为什么这个程序的执行需要 10 秒,而不是 15 秒。
fun main() = runBlocking {
println("Start")
val job = launch {
repeat(5) {
delay(1000)
println(it)
}
}
println("Suspending.....")
delay(10000)
println("Finish")
}
毕竟会用到主流。这是否意味着我们将简单地跳过等待部分(如果这种等待是由真正的延迟提供的,例如,在访问数据库时,在非特殊延迟函数中会发生什么)。当然,延迟只是无用的延迟,可以简单的去除
因为
launch
开始新的协程。它与delay(10000)
并行运行
See javaDoc
launch
在不阻塞当前线程的情况下启动一个新协程
“将使用主流”我假设你的意思是
runBlocking
默认情况下只使用一个线程。这是真的,但是 delay()
正在挂起,所以它不会阻塞调用它的线程。因此,当您启动另一个子协程时,它会与下面的 delay(10000)
调用并行运行。
你是对的,如果这些是分别花费 5 秒和 10 秒的阻塞操作,那么整个协程将需要 15 秒才能完成,因为它无法在单线程调度程序上并行运行已启动的子协程
runBlocking
。如果你使用像 runBlocking(Dispatchers.IO) { }
这样的东西,所以它不是单线程的,那么它仍然可以并行运行它们。