在kotlinx.coroutines
库中,所有协程生成器(如launch
,async
等)都采用CoroutineContext
参数,但也具有带有parent
类型的附加Job
参数。 CoroutineContext
和Job
有什么区别?
最佳答案
Job
表示协程或正在执行的某种聚合任务。 Job
是CoroutineContext.Element
,这意味着它可以存储在协程上下文中。 CoroutineContext
是不同协程上下文元素的集合,而job只是这样一个元素。
实际上,协程上下文更像是一个 map ,因为您可以使用协程元素键从中检索元素。例如,如果您具有类型ctx
的值CoroutineContext
,则可以使用ctx[Job]
表达式从中检索作业。可以在coroutines design document和documentation for CoroutineContext的相应部分找到更多详细信息。
当启动新的协程时,可以指定完整的上下文。如果此上下文包含一个作业,则相应的作业将成为新协程的父级。
协程生成器(例如parent
)的launch
参数只是使父级作业规范更明确的一种方便。正如launch
的文档突出显示here一样,显式指定的父作业优先于上下文中指定的作业。该指南的this section中给出了有关如何使用它的实际示例。