【发布时间】:2020-07-24 13:48:12
【问题描述】:
有人能告诉我这个代码示例中发生了什么吗:
import kotlinx.coroutines.*
import kotlin.time.*
fun subTask(scope: CoroutineScope): Job {
val job = scope.launch(Dispatchers.IO){
println("SubTask started.")
delay(500L)
println("SubTask ending.")
}
job.invokeOnCompletion(object: CompletionHandler{
override fun invoke(cause: Throwable?) {
println("SubTask completed.")
}
})
return job
}
fun main() {
val duration = measureTime {
runBlocking {
val job = withContext(Dispatchers.IO) {
subTask(this)
}
println("Waiting for SubTask")
job.join()
}
}
println("Duration: $duration")
}
(Click here for Kotlin playground)
我期待看到
SubTask started.
Waiting for SubTask
SubTask ending.
SubTask completed.
Duration: 600ms
但我得到了
SubTask started.
SubTask ending.
SubTask completed.
Waiting for SubTask
Duration: 600ms
为什么 subTask 不与 main() 并行运行?
【问题讨论】:
-
join()先是invokeOnCompletion() -
invokeOnCompletion 不是问题。它按预期调用 - 当作业完成时。问题是作业在调用 join() 之前完成了它的 delay() 调用。