Kotlin 协程

问题描述 投票:0回答:2

告诉我为什么这个程序的执行需要 10 秒,而不是 15 秒。

fun main() = runBlocking {
    println("Start")
    val job = launch {
        repeat(5) {
            delay(1000)
            println(it)
        }
    }

    println("Suspending.....")
    delay(10000)
    println("Finish")
}

毕竟会用到主流。这是否意味着我们将简单地跳过等待部分(如果这种等待是由真正的延迟提供的,例如,在访问数据库时,在非特殊延迟函数中会发生什么)。当然,延迟只是无用的延迟,可以简单的去除

kotlin asynchronous kotlin-coroutines
2个回答
3
投票

因为

launch
开始新的协程。它与
delay(10000)

并行运行

See javaDoc

launch

在不阻塞当前线程的情况下启动一个新协程


0
投票

“将使用主流”我假设你的意思是

runBlocking
默认情况下只使用一个线程。这是真的,但是
delay()
正在挂起,所以它不会阻塞调用它的线程。因此,当您启动另一个子协程时,它会与下面的
delay(10000)
调用并行运行。

你是对的,如果这些是分别花费 5 秒和 10 秒的阻塞操作,那么整个协程将需要 15 秒才能完成,因为它无法在单线程调度程序上并行运行已启动的子协程

runBlocking
。如果你使用像
runBlocking(Dispatchers.IO) { }
这样的东西,所以它不是单线程的,那么它仍然可以并行运行它们。

© www.soinside.com 2019 - 2024. All rights reserved.