【问题标题】:Kotlin coroutine execution order?Kotlin协程执行顺序?
【发布时间】: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() 调用。

标签: kotlin kotlin-coroutines


【解决方案1】:

withContext 暂停直到完成。由于您将withContext 的范围传递给subTask() 并且subTask() 使用它来启动它的工作,withContext 将暂停直到另一个启动的工作完成。如果subTask() 使用了不同的CoroutineScope,或者如果您没有将您的subTask() 调用包装在withContext 中,那么您将获得预期的行为。

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2019-10-22
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多