根据文档,延迟会挂起协程,但不会阻塞线程:
延迟是一个特殊的挂起函数。它会将协同程序暂停一段特定的时间。挂起协程不会阻塞底层线程,但允许其他协程运行并将底层线程用于其代码。
但是当运行此代码时:
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显然是第一个和最后一个,所以我们可以忽略它们。因此,对于他们中的其他人,我们有:
打印 | 延迟 | 总延迟|
---|---|---|
2 | 500 | |
3 | 500、1000、1000 | 2500 |
4 | 1000 | <1000>
so the delay is more as compared to the second coroutine
不,第一个延迟是:500L,第二个延迟为:1000L