什么是协程以及为什么需要它们?
协程是 Kotlin 中用于异步编程的强大工具,它允许您以命令式风格编写非阻塞代码。与传统的线程不同,协程是轻量级的:您可以在一个线程上运行数千个协程,而不会消耗大量内存。
协程的主要任务是简化异步操作的处理:网络请求、数据库读取、文件操作以及其他需要等待的任务。您无需使用复杂的回调或响应式流,而是编写顺序代码,该代码在等待期间暂停,并在操作完成后恢复执行。
协程库是 Kotlin 生态系统的一部分,并由 JetBrains 官方支持。它广泛用于 Android 开发、服务器端应用程序(Ktor、Spring WebFlux)甚至桌面应用程序中。
安装协程
由于协程不是通过 pip 或 npm 安装的独立库,而是 Kotlin 生态系统的一部分,因此其引入方式取决于您的构建管理器。
Gradle(Kotlin DSL)
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") // 用于 Android 或使用 Dispatchers.Main implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")}Gradle(Groovy DSL)
dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'}Maven
<dependency> <groupId>org.jetbrains.kotlinx</groupId> <artifactId>kotlinx-coroutines-core</artifactId> <version>1.9.0</version></dependency>快速入门:第一个示例
让我们编写一个简单的程序,启动一个协程,暂停并输出一条消息:
import kotlinx.coroutines.*
fun main() = runBlocking { println("程序开始:${Thread.currentThread().name}") launch { delay(1000L) // 暂停协程 1 秒(不阻塞线程) println("世界!(来自协程:${Thread.currentThread().name})") } println("你好,(来自 main:${Thread.currentThread().name})") delay(500L) // 等待,以便协程有机会执行 println("程序结束")}输出:
程序开始:main @coroutine#1你好,(来自 main:@coroutine#1)世界!(来自协程:@coroutine#2)程序结束请注意:delay() 不会阻塞线程,而只会暂停当前协程。main 线程仍然可以自由处理其他任务。
协程的主要方法和函数
1. runBlocking
作用: 启动一个新的协程并阻塞当前线程直到其完成。用作普通同步代码与协程世界之间的桥梁(通常在 main 函数或测试中使用)。
参数:
context: CoroutineContext— 协程上下文(默认为 EmptyCoroutineContext)block: suspend CoroutineScope.() -> T— 将要执行的挂起代码块
示例:
fun main() { val result = runBlocking { delay(1000L) "完成!" } println(result) // 输出:完成!}2. launch
作用: 启动一个不返回结果的新协程(即“发射后不管”模式)。返回一个 Job 对象,可用于取消或等待。
参数:
context: CoroutineContext