Kotlin异步编程完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 异步编程:完整指南

异步编程是一种开发方法,程序在等待长时间操作(如网络请求、文件读取或数据库操作)完成时不会阻塞执行,而是继续执行其他任务,结果稍后返回。在 Kotlin 世界中,异步工作的主要工具是 协程(coroutines) —— 一种轻量级线程,允许近乎同步地编写异步代码。

在本文中,我们将从基础到高级技术详细讲解 Kotlin 中的异步编程工作方式。您将学习如何有效使用协程、避免阻塞以及编写可扩展的应用程序。



1. Kotlin 协程基础

协程是 Kotlin 异步编程的核心概念。它们允许在不阻塞线程的情况下暂停函数执行。kotlinx.coroutines 库用于处理协程。以下是一个最小示例:

import kotlinx.coroutines.*

fun main() = runBlocking { launch { delay(1000L) // 非阻塞延迟 println("World!") } println("Hello,")}

在这段代码中,runBlocking 为协程创建了一个阻塞上下文(通常仅用于 main 函数或测试),而 launch 启动了一个新的协程。delay 函数是一个挂起函数,它会暂停协程而不阻塞线程。

关键概念:

  • CoroutineScope —— 协程的作用域,管理协程的生命周期。
  • CoroutineContext —— 一组设置(调度器、异常处理器)。
  • 挂起函数(Suspend function) —— 可以暂停并在之后恢复执行的函数。


2. 挂起函数与调度器

挂起函数是异步代码的基础。它们可以调用其他挂起函数(delay、withContext)并暂停执行。示例:

suspend fun fetchUserData(): String {    delay(2000L) // 模拟网络请求    return "User data"}

fun main() = runBlocking { val data = async { fetchUserData() } println("Loading...") println(data.await()) // 等待结果}

调度器(Dispatchers)决定协程在哪个线程上执行:

  • Dispatchers.Default —— 用于 CPU 密集型任务(默认)。
  • Dispatchers.IO —— 用于 I/O 操作(网络、文件)。
  • Dispatchers.Main —— 用于 UI 线程(Android、Swing)。
  • Dispatchers.Unconfined —— 不绑定到特定线程(很少使用)。

使用调度器切换的示例:

suspend fun loadData(): String = withContext(Dispatchers.IO) {    // 在后台线程中执行重操作    Thread.sleep(1000L) // 模拟阻塞操作    "Result"}

正确使用调度器对性能至关重要。不要在长时间操作中使用 Dispatchers.Main —— 这会阻塞 UI。



3. 使用 async/await 和 Channel

要并行执行多个任务,请使用 async 和 await。async 返回一个 Deferred 对象,可以等待其结果:

fun main() = runBlocking {    val result1 = async(Dispatchers.IO) { fetchFromApi("url1") }    val result2 = async(Dispatchers.IO) { fetchFromApi("url2") }    println("Result 1: ${result1.await()}")    println("Result 2: ${result2.await()}")}

suspend fun fetchFromApi(url: String): String { delay(1000L) return "Response from $url"

博客

书籍推荐