协程
应用程序通常需要同时执行多个任务,例如响应用户输入、加载数据或更新屏幕。为支持此功能,它们依赖于并发,这允许操作独立运行而互不阻塞。
最常见的并发运行任务的方式是使用线程,线程是由操作系统管理的独立执行路径。然而,线程相对“重”(heavy),创建过多可能导致性能问题。
为支持高效并发,Kotlin 使用基于协程的异步编程,它允许你使用挂起函数以自然、顺序的风格编写异步代码。协程是线程的轻量级替代品。它们可以在不阻塞系统资源的情况下挂起,并且资源友好,因此更适合细粒度的并发。
大多数协程****特性由 kotlinx.coroutines
库提供,该库包含用于启动协程、处理并发、使用异步流等的工具。
如果你是 Kotlin 协程的新手,请在深入学习更复杂的主题之前,从 协程基础知识指南开始。本指南通过简单的示例介绍了挂起函数、协程构建器和结构化并发的关键概念:
关于****协程在实践中的用法,请检测 KotlinConf 应用 的示例项目。
协程****概念
kotlinx.coroutines
库提供了用于并发运行任务、构建****协程执行以及管理共享状态的核心构建块。
挂起函数与协程构建器
Kotlin 中的协程基于挂起函数****构建,它允许代码暂停和恢复而不阻塞线程。suspend
关键字标记可以异步执行长时间运行操作的函数。
要启动新的协程,请使用协程构建器,例如 .launch()
和 .async()
。这些构建器是 CoroutineScope
上的扩展函数,它定义了协程的生命周期并提供了协程上下文。
关于这些构建器的更多信息,请参见 协程基础知识 和 组合挂起函数。
协程上下文与行为
从 CoroutineScope
启动协程会创建一个上下文,它管理协程的执行。.launch()
和 .async()
等构建器函数会自动创建一组元素,用于定义****协程的行为:
Job
接口跟踪协程的生命周期并启用结构化并发。CoroutineDispatcher
控制协程的运行位置,例如在后台线程或 UI 应用程序的主线程上。CoroutineExceptionHandler
处理未捕获的异常。
这些元素,以及其他可能的元素,构成了 协程上下文,该上下文默认继承自协程的父级。此上下文形成一个层次结构,它实现了结构化并发,其中相关的协程可以一起 取消 或作为一个组 处理异常。
异步流与共享可变状态
Kotlin 提供了多种协程通信的方式。关于如何在协程之间共享值,请根据你的需求选择以下选项之一:
Flow
仅在协程主动收集时才生产值。Channel
允许多个协程发送和接收值,每个值都只传递给一个协程。SharedFlow
持续与所有活动的收集协程共享每个值。
当多个协程需要访问或更新相同数据时,它们会 共享可变状态。如果缺乏协调,这可能导致竞态条件,其中操作会以不可预测的方式相互干扰。为了安全地管理共享可变状态,请使用 StateFlow
包装共享数据。然后,你可以从一个协程更新它,并从其他协程收集其最新值。
关于更多信息,请参见 异步流、通道 和 协程与通道****教程。
后续步骤
- 关于 协程、挂起函数和构建器的基本原理,请参见 协程基础知识指南。
- 关于如何组合挂起函数并构建协程流水线,请探查 组合挂起函数。
- 关于如何使用 IntelliJ IDEA 中的内置工具 调试****协程,请参见该指南。
- 关于特定于 Flow 的调试,请参见 使用 IntelliJ IDEA 调试 Kotlin Flow教程。
- 关于基于协程的 UI 开发,请参阅 协程 UI 编程指南。
- 关于在 Android 中使用协程的 最佳实践,请审阅。
- 请检测
kotlinx.coroutines
API 参考。