一项协同工作的延迟会影响另一项吗



根据文档,延迟会挂起协程,但不会阻塞线程:

延迟是一个特殊的挂起函数。它会将协同程序暂停一段特定的时间。挂起协程不会阻塞底层线程,但允许其他协程运行并将底层线程用于其代码。

但是当运行此代码时:

fun main() {
    println("1")
    GlobalScope.launch {
        doSomething()
        delay(1000L)
        println("3")
    }
    GlobalScope.launch {
        delay(1000L)
        println("4")
    }
    println("5")
}
suspend fun doSomething() {
    delay(500L)
    println("2")
    delay(1000L)
}

给出的输出是:

1
5
2
4
3 

根据我的理解,它应该显示1 5 4 2 3。这是因为doSomething()在第一个协程中被调用,因此与第二个协程相比延迟更大,并且第二个协同程是异步调用的。我的误解在哪里?

同样使用这段代码,两个值在2秒后打印在一起:

fun main() {
    GlobalScope.launch {
        val value1 = doSomething1()
        val value2 = doSomething2()
        println(value1)
        println(value2)
    }
}
suspend fun doSomething1(): String {
    delay(1000L)
    return "This is the answer1"
}
suspend fun doSomething2(): String {
    delay(1000L)
    return "This is the answer2"
}

为什么会这样?

TL;DR

不,不同工作的延误不会相互影响。


对于您的第一个问题,1和5显然是第一个和最后一个,所以我们可以忽略它们。因此,对于他们中的其他人,我们有:

总延迟<1000>
打印 延迟
2 500
3 500、1000、1000 2500
4 1000
so the delay is more as compared to the second coroutine

不,第一个延迟是:500L,第二个延迟为:1000L

最新更新