5.12.2 协程
3 分钟阅读
5.12.2 协程
应用经常需要同时执行多个任务,例如响应用户输入、加载数据或刷新界面。为支持这一点,它们依赖并发,让各个操作能够独立运行而互不阻塞。
并发执行任务最常见的方式是使用线程,它是由操作系统管理的独立执行路径。不过线程相对较重,创建大量线程可能导致性能问题。
为支持高效的并发,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 中的内置工具调试协程。
- 如需针对流的调试,请参阅使用 IntelliJ IDEA 调试 Kotlin Flow 教程。
- 阅读协程 UI 编程指南,了解基于协程的 UI 开发。
- 查看在 Android 中使用协程的最佳实践。
- 查阅
kotlinx.coroutinesAPI 参考。