在 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
函数等待所有任务完成。