Skip to content

协程

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

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

为支持高效并发,Kotlin 使用基于协程的异步编程,它允许你使用挂起函数以自然、顺序的风格编写异步代码。协程线程的轻量级替代品。它们可以在不阻塞系统资源的情况下挂起,并且资源友好,因此更适合细粒度的并发

大多数协程****特性kotlinx.coroutines 库提供,该库包含用于启动协程、处理并发、使用异步流等的工具。

如果你是 Kotlin 协程的新手,请在深入学习更复杂的主题之前,从 协程基础知识指南开始。本指南通过简单的示例介绍了挂起函数协程构建器结构化并发的关键概念

Get started with coroutines

关于****协程在实践中的用法,请检测 KotlinConf 应用 的示例项目

协程****概念

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

挂起函数协程构建器

Kotlin 中的协程基于挂起函数****构建,它允许代码暂停和恢复而不阻塞线程suspend 关键字标记可以异步执行长时间运行操作的函数

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

关于这些构建器的更多信息,请参见 协程基础知识组合挂起函数

协程上下文与行为

CoroutineScope 启动协程会创建一个上下文,它管理协程的执行。.launch().async()构建器函数会自动创建一组元素,用于定义****协程的行为:

这些元素,以及其他可能的元素,构成了 协程上下文,该上下文默认继承协程的父级。此上下文形成一个层次结构,它实现了结构化并发,其中相关的协程可以一起 取消 或作为一个组 处理异常

异步流与共享可变状态

Kotlin 提供了多种协程通信的方式。关于如何在协程之间共享值,请根据你的需求选择以下选项之一:

  • Flow 仅在协程主动收集时才生产值。
  • Channel 允许多个协程发送和接收值,每个值都只传递给一个协程
  • SharedFlow 持续与所有活动的收集协程共享每个值。

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

关于更多信息,请参见 异步流通道协程通道****教程

后续步骤