【发布时间】:2018-05-21 06:15:26
【问题描述】:
在kotlinx.coroutines 库中,所有协程构建器(如launch、async 等)都采用CoroutineContext 参数,但还有一个额外的parent 参数,其类型为Job。 CoroutineContext和Job有什么区别?
【问题讨论】:
标签: kotlin coroutine kotlin-coroutines
在kotlinx.coroutines 库中,所有协程构建器(如launch、async 等)都采用CoroutineContext 参数,但还有一个额外的parent 参数,其类型为Job。 CoroutineContext和Job有什么区别?
【问题讨论】:
标签: kotlin coroutine kotlin-coroutines
Job 表示正在执行的协程或某种聚合任务。 Job 是 CoroutineContext.Element,这意味着它可以存储在协程上下文中。 CoroutineContext 是不同协程上下文元素的集合,job 只是其中一个元素。
实际上,协程上下文更像是一个映射,因为您可以使用协程元素键从中检索元素。例如,如果您有一个类型为CoroutineContext 的值ctx,那么您可以使用ctx[Job] 表达式从中检索作业。更多详细信息可以在coroutines design document和documentation for CoroutineContext的相应部分找到。
当一个新的协程启动时,可以指定完整的上下文。如果此上下文包含一个作业,则相应的作业将成为新协程的 父。
像launch 这样的协程构建器的parent 参数只是为了使父作业规范更加明确。 launch 的文档强调 here 明确指定的父作业优先于上下文中指定的作业。指南的this section 中给出了如何使用它的实际示例。
【讨论】: