【问题标题】:Sequential coroutines in KotlinKotlin 中的顺序协程
【发布时间】:2021-07-20 23:22:09
【问题描述】:

我正在尝试了解顺序协同程序在 Kotlin 中的工作原理。

下一个示例将按顺序运行它们:

fun main(): Unit = runBlocking {
    launch {
        delay(1000) // Note the delay
        println("A")
    }.join()

    launch {
        println("B")
    }.join()
}

作为结果,“A”-->“B”

但是next运行的时候,结果是“B”-->“A”,这是我看不懂的:

fun main(): Unit = runBlocking {

    val jobA = launch {
        delay(1000)
        println("A")
    }

    val jobB = launch {
        println("B")
    }

    jobA.join()
    jobB.join()
}

当我首先调用 jobA.join() 时,我原以为它会等到完成后再执行 jobB,无论 jobA 是否调用延迟。 对此有何解释?那么作业实例如何在内部延迟的情况下按顺序执行?

【问题讨论】:

    标签: concurrency kotlin-coroutines


    【解决方案1】:

    在您的第二个示例中,您启动了两个同时执行的协程。之后,您的顶级协程等待第一个协程完成,然后等待第二个协程完成。等待并发协程完成不会干扰它们的执行。

    因此,协程按程序执行,第一个在延迟后打印,第二个立即打印。

    【讨论】:

    • 在第二个示例中,我不明白为什么会在调用 jobA.join() 时同时启动,我认为这会在继续之前强制完成第一项工作。是因为jobA中的“延迟”不是阻塞调用吗?然后它允许进入 jobB.join() 然后在 jobA 的延迟完成之前执行?
    • 想象一下用thread { } 替换launch { }。你希望那时会发生什么?正确答案与此处相同:无论您是否joining 他们,您都应该期望两个线程都独立运行。协程的行为类似于线程,唯一不同的行为发生在您在协程中执行阻塞操作时,这被认为是错误。
    • 对,join 调用将等待协程完成后再继续,但这并不意味着协程内的代码尚未运行 .只要调用launch { .. },该协程就会运行。因此,当join 调用移至末尾时,它们就像@MarkoTopolnik 所说的那样同时运行。 join 电话只是等待它完成。我认为这就像等待Future:它通常已经在运行并调用Future.get() 只是等待它完成并且在此处相当于join
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多