首页 > 解决方案 > Kotlin Coroutines Job 层次结构解释

问题描述

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

协程作业层次结构

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

尽管他们将文章解释为:

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

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

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

标签: kotlin-coroutines

解决方案


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

在您的图表中,Job()内部scope完全被忽略了。顶层launch创建自己的StandaloneCoroutine并将SupervisorJob您传入的指定为其父级。

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


推荐阅读