Kotlin 异步编程简介
现代应用程序需要高性能和快速响应。Kotlin 中的异步编程是一种强大的工具,它允许您编写非阻塞代码,高效利用系统资源。与传统多线程不同,Kotlin 协程提供了轻量级的执行线程,可以在不阻塞主线程的情况下暂停和恢复。
在本指南中,我们将详细解析 Kotlin 异步编程的关键概念:从基本的协程到使用 Flow 和 Channel 的高级模式。您将学会创建高效、运行快速且可靠的异步应用程序。
Kotlin 协程基础
什么是协程?
协程是一种轻量级的执行线程,可以在某个点暂停,在另一个点恢复。在 Kotlin 中,协程通过 suspend 关键字和特殊的构建器在语言层面实现。
启动第一个协程
要使用协程,您需要在 build.gradle.kts 中添加依赖:
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}启动协程的基本示例:
import kotlinx.coroutines.*
fun main() = runBlocking { launch { delay(1000L) println("World!") } println("Hello,")}执行结果:
Hello,World!挂起函数
挂起函数是可以在不阻塞线程的情况下暂停协程执行的函数。它们使用 suspend 关键字标记:
suspend fun fetchUserData(): String { delay(2000L) // 模拟网络请求 return "User data"}
fun main() = runBlocking { val data = fetchUserData() println(data)}管理协程:作用域与调度器
CoroutineScope
CoroutineScope 定义了协程的生命周期。所有协程都在特定的作用域内启动。如果作用域被取消,其所有子协程也会被取消。
class MyViewModel : ViewModel() { private val scope = CoroutineScope(Dispatchers.Main + SupervisorJob()) fun loadData() { scope.launch { val data = fetchData() updateUI(data) } } override fun onCleared() { super.onCleared() scope.cancel() }}调度器:选择执行线程
调度器决定了协程将在哪个线程池上执行。主要类型:
Dispatchers.Main— 用于 UI 线程(Android、JavaFX)Dispatchers.IO— 用于输入/输出操作(网络、文件)Dispatchers.Default— 用于 CPU 密集型任务Dispatchers.Unconfined— 不绑定到特定线程
fun main() = runBlocking { launch(Dispatchers.IO) { println("Executing on IO: ${Thread.currentThread().name}") } launch(Dispatchers.Default) { println("Executing on Default: ${Thread.currentThread().name}") }}进阶技巧:async/await 与协程取消
使用 async 进行并行执行
async 构建器允许您并行启动多个任务,并通过 await() 获取结果:
suspend fun fetchDataFromApi1(): String { delay(1000L) return "Result from API 1"}
suspend fun fetchDataFromApi2(): String { delay(1500L) return "Result from API 2"}
fun main() = runBlocking { val time = measureTimeMillis { val result1 = async { fetchDataFromApi1() } val