在 Kotlin 中,实现并发主要依赖于协程(coroutines)。协程是一种轻量级的线程,它允许你编写异步代码,而无需处理线程或线程池。Kotlin 提供了强大的协程库,使得编写并发代码变得简单而高效。
以下是如何使用 Kotlin 协程实现并发的几个关键概念:
引入协程依赖:
在你的 build.gradle 文件中添加 Kotlin 协程库的依赖:
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0'
}
创建协程作用域:
使用 CoroutineScope 创建一个协程作用域,以便在其中启动和管理协程。你可以使用 GlobalScope 或自定义的作用域。
val scope = CoroutineScope(Dispatchers.Default)
启动协程:
使用 launch 或 async 函数启动协程。launch 用于非阻塞的异步任务,而 async 用于可以返回结果的异步任务。
scope.launch {
// 异步任务代码
}
使用 Dispatchers:
Kotlin 提供了不同的调度器(dispatchers),如 Dispatchers.Default、Dispatchers.IO 和 Dispatchers.Main。你可以根据需要选择合适的调度器来执行协程。
scope.launch(Dispatchers.IO) {
// 执行 I/O 密集型任务
}
处理结果:
如果你使用 async 启动了一个返回结果的协程,可以使用 await() 函数获取结果。
val result = scope.async(Dispatchers.IO) {
// 执行 I/O 密集型任务并返回结果
}.await()
取消协程:
你可以使用 cancel 函数取消协程。一旦协程被取消,它将停止执行并抛出 CancellationException。
val job = scope.launch {
// 异步任务代码
}
// 取消协程
job.cancel()
以下是一个完整的示例,展示了如何使用 Kotlin 协程实现并发:
import kotlinx.coroutines.*
fun main() = runBlocking {
val scope = CoroutineScope(Dispatchers.Default)
val jobs = List(10) {
scope.launch(Dispatchers.IO) {
performTask("Task $it")
}
}
jobs.forEach { it.join() }
}
suspend fun performTask(task: String): String {
delay(1000L) // 模拟 I/O 操作
println("$task completed")
return task
}
在这个示例中,我们创建了一个协程作用域,并在其中启动了 10 个异步任务。每个任务都在 Dispatchers.IO 上执行,模拟 I/O 操作。最后,我们使用 join 函数等待所有任务完成。