Skip to content

协程

应用程序通常需要同时执行多个任务,例如响应用户输入、加载数据或更新屏幕。 为此,它们依赖并发,并发允许操作独立运行而互不阻塞。

并发运行任务最常用的方式是使用线程,线程是由操作系统管理的独立执行路径。 然而,线程相对较重,创建过多的线程可能会导致性能问题。

为了支持高效并发,Kotlin 使用围绕 协程 构建的异步编程,让你能够使用挂起函数以自然、顺序的风格编写异步代码。 协程是线程的轻量级替代方案。 它们可以在不阻塞系统资源的情况下挂起,并且对资源友好,这使得它们更适合细粒度的并发。

大多数协程功能由 kotlinx.coroutines 库提供,该库包含用于启动协程、处理并发、处理异步流等工具。

如果你是 Kotlin 协程的新手,请在深入研究更复杂的主题之前,先从 协程基础 指南开始。 本指南通过简单的示例介绍了挂起函数、协程构建器和结构化并发的核心概念:

开始使用协程

查看 KotlinConf 应用 示例项目,了解协程在实践中是如何使用的。

协程概念

kotlinx.coroutines 库提供了用于并发运行任务、组织协程执行以及管理共享状态的核心构建块。

挂起函数与协程构建器

Kotlin 中的协程构建在挂起函数之上,挂起函数允许代码在不阻塞线程的情况下暂停和恢复。 suspend 关键字用于标记可以异步执行长时间运行操作的函数。

要启动新协程,请使用协程构建器,例如 .launch().async()。 这些构建器是 CoroutineScope 的扩展函数,它定义了协程的生命周期并提供了协程上下文。

你可以在 协程基础组合挂起函数 中了解更多关于这些构建器的信息。

协程上下文与行为

CoroutineScope 启动协程会创建一个控制其执行的上下文。 像 .launch().async() 这样的构建器函数会自动创建一组定义协程行为的元素:

这些元素连同其他可能的元素构成了 协程上下文,默认情况下它从协程的父级继承。 此上下文形成了一个支持结构化并发的层次结构,在其中相关的协程可以被一起 取消 或作为一个组进行 异常处理

异步流与共享可变状态

Kotlin 提供了几种协程通信的方式。 根据你希望如何在协程之间共享值,选择以下选项之一:

  • Flow 仅在协程主动收集它们时才产生值。
  • Channel 允许多个协程发送和接收值,每个值被精确地传递给一个协程。
  • SharedFlow 持续地将每个值共享给所有处于活动状态的收集协程。

当多个协程需要访问或更新相同的数据时,它们会 共享可变状态。 如果没有协调,这可能会导致竞态条件,即操作以不可预测的方式相互干扰。 为了安全地管理共享可变状态,请使用 StateFlow 来包装共享数据。 然后,你可以从一个协程更新它,并从其他协程收集它的最新值。

更多信息请参阅 异步流通道 以及 协程与通道教程

后续步骤