【问题标题】:Kotlin Coroutines Job hierarchy explanationKotlin Coroutines Job 层次结构解释
【发布时间】:2020-07-08 23:33:10
【问题描述】:

在阅读有关协程异常的有趣article 时。我遇到了包含以下图片的部分:

我试图了解父 Job 是如何以及从哪里来的?

虽然他们将这篇文章解释为:

一个新的协程总是被分配一个新的 Job()

但是查看代码,我看到一个带有Job 的顶级作用域,当调用“父”launch 时,我们用SupervisorJob 覆盖它,然后是两个子launch,我猜它继承了父作业或创建自己的作业。

那么,我的问题是父作业从何而来(包含 2 个子作业的那个)?

【问题讨论】:

    标签: kotlin-coroutines


    【解决方案1】:

    您传递给launch 的内容将成为launch 内部创建的作业的父级。该作业始终属于同一类型,即StandaloneCoroutine。你无法控制协程对应的Job实例,你只能决定它的父级。

    在您的图表中,scope 中的 Job() 被完全忽略。顶级launch 创建自己的StandaloneCoroutine 并分配您传入的SupervisorJob 作为其父级。

    在您的图表中表示的特定情况下,SupervisorJob 没有任何效果,因为它不会阻止任何协程故障的蔓延。如果两个内部 launch 协程中的任何一个失败,顶级 launch 将被取消。唯一的区别是 SupervisorJob 将保持活动状态,但此时它没有子节点。

    【讨论】:

    • 所以如果我理解正确的话,那种情况下的SupervisorJob只是替换了作用域的Job
    • 是的,就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2011-09-19
    • 2014-03-18
    相关资源
    最近更新 更多