Concurrency Kotlin中的顺序协同路由

Concurrency Kotlin中的顺序协同路由,concurrency,kotlin-coroutines,Concurrency,Kotlin Coroutines,我试图了解在Kotlin中顺序协同程序是如何工作的 下一个示例将按顺序运行它们: fun main(): Unit = runBlocking { launch { delay(1000) // Note the delay println("A") }.join() launch { println("B") }.join() } 作为结果,“A”-->“B” 但是当运行

我试图了解在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是否调用延迟。
对此有何解释?那么,作业实例如何在内部延迟的情况下顺序执行呢?

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


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

在第二个示例中,我不明白为什么在调用jobA.join()时同时启动,我认为这会强制完成第一个作业,然后再继续。是因为jobA中的“延迟”不是阻塞呼叫吗?然后,它允许单步执行jobB.join(),然后在jobA延迟完成之前执行?想象一下用
线程{}
替换
启动{}
。那么你希望发生什么?正确答案与此相同:您应该期望两个线程都独立运行,无论您是否加入它们。协同路由的行为类似于线程,当您在协同路由中执行阻塞操作时,行为上的唯一区别就出现了,这被认为是一个错误。
join
调用将在继续之前等待协同路由完成,但这并不意味着协同路由中的代码尚未运行。只要调用
launch{..}
,该协同程序就会运行。因此,当
join
调用移到末尾时,它们会像@MarkoTopolnik所说的那样并发运行。
join
调用只是等待它完成。我认为这就像是在等待一个
未来
:它通常已经在运行并调用
Future.get()。