【发布时间】:2019-02-21 11:34:59
【问题描述】:
你能解释一下这两个代码块有什么区别吗?第一次打印 421,但第二次打印 606。为什么第一个是并行的,第二个是顺序的?
fun main(args: Array<String>) = runBlocking {
var time = measureTimeMillis {
val one = async { one() }
val two = async { two() }
val int1 = one.await()
val int2 = two.await()
println(int1 + int2)
}
println(time)
time = measureTimeMillis {
val one = async { one() }.await()
val two = async { two() }.await()
println(one + two)
}
print(time)
}
suspend fun one(): Int {
delay(200)
return 12
}
suspend fun two(): Int {
delay(400)
return 23
}
【问题讨论】:
-
我不确定您如何获得这些值中的任何一个。 12 + 23 = 35。你究竟如何得到 421 和 606 超出了我的理解。也许确认您在问题中输入的内容,然后我会看看是否可以提供帮助。异步等待通常替换为“withContext(yourProviderThread){} 然后不需要等待,但无论哪种方式 async { someMethod }.await() 都是可以接受的,如果你不等待排队,那么你可以轻松做到one.await() + two.await() 这也应该给出相同的值。但是当你的输出不对齐时很难推测。
-
421/606 是运行变体 1 和变体 2 所需的毫秒数 ;-)
标签: kotlin coroutine kotlin-coroutines