首页 > 解决方案 > 为什么这些协程没有给出预期的输出?

问题描述

我试图理解 Kotlin 中的协程,但我遇到了一些障碍。在以下示例中,我希望会发生以下情况:

但它会打印:

0
3
2
1
4
5
6

我真的不明白为什么会这样。我大多不明白job2can before 的输出是如何出现的4。我很迷茫。

println("0")
runBlocking {
    val job = GlobalScope.launch {
        // launch new coroutine and keep a reference to its Job
        delay(1200L)
        println("1")
    }
    val job2 = GlobalScope.launch {
        // launch new coroutine and keep a reference to its Job
        delay(1000L)
        println("2")
    }

    println("3")
    job.join() // wait until child coroutine completes
    println("4")
    job2.join() // wait until child coroutine
    println("5")
}
println("6")

标签: kotlinkotlinx.coroutines

解决方案


这就是发生的事情:

  1. 打印 0
  2. enter runBlocking,它阻塞当前线程,直到阻塞完成。
  3. 设置和启动 作业1;作业立即开始执行,并被延迟语句暂停 1200 毫秒。
  4. 设置和启动job2;该作业立即开始执行,并通过延迟语句暂停1000m。
  5. 打印 3
  6. 等待(暂停执行)直到作业 1 完成(job.join())。
  7. 1000 毫秒后 job2打印 2并完成
  8. 1200 毫秒后 job1打印 1并完成
  9. 打印 4(因为作业 1 已完成)
  10. 等待(暂停执行)直到 job2 完成(job2.join())。这会立即返回,因为 job2 已经完成。
  11. 打印 5
  12. print 6,在runBlocking -block完成并且启动它的线程继续之后。

您可以阅读https://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html以更好地了解挂起函数。帮助我理解协程的是这段视频:https ://www.youtube.com/watch?v=_hfBv0a09Jc


推荐阅读