Kotlin 协程调度器
Kotlin协程提供了多种调度器(Dispatchers)来管理线程执行:Main用于UI操作,IO用于网络/文件,Default用于CPU密集型任务,Unconfined则无固定线程限制。开发者可通过withContext切换调度器,支持自定义线程池和组合调度策略。实际应用中,应根据场景选择合适调度器(如Android用Main+lifecycleScope,后台服务用IO),并注意作用域管理。
·
本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
1. 主要调度器
| 调度器 | 用途 | 线程池 |
|---|---|---|
Dispatchers.Main |
UI 操作 | 主线程(Android/Swing/JavaFX) |
Dispatchers.IO |
网络、文件操作 | 共享线程池,可动态扩展 |
Dispatchers.Default |
CPU 密集型任务 | 线程数 = CPU 核心数 |
Dispatchers.Unconfined |
特殊场景 | 不固定,延续在任意线程 |
2. 使用示例
suspend fun example() {
// Main - UI 操作
withContext(Dispatchers.Main) {
textView.text = "Loading..."
}
// IO - 网络/文件操作
val data = withContext(Dispatchers.IO) {
api.fetchData() // 网络请求
}
// Default - CPU 密集型
val result = withContext(Dispatchers.Default) {
heavyComputation() // 复杂计算
}
// 更新 UI
withContext(Dispatchers.Main) {
textView.text = result
}
}
3. 调度器特性对比
// 查看线程池信息
println(Dispatchers.Default) // Dispatchers.Default
println(Dispatchers.IO) // Dispatchers.IO
println(Dispatchers.Main) // Dispatchers.Main
println(Dispatchers.Unconfined) // Dispatchers.Unconfined
// 限制并行度
val limited = Dispatchers.IO.limitedParallelism(5)
4. 自定义调度器
// 创建单线程调度器
val singleThread = newSingleThreadContext("MyThread")
// 创建固定大小线程池
val fixedThread = newFixedThreadPoolContext(4, "MyPool")
// 使用 Executor 转换
val executor = Executors.newCachedThreadPool().asCoroutineDispatcher()
作用域 + 调度器组合
创建自定义作用域
// 组合多个上下文元素
val scope = CoroutineScope(
Dispatchers.IO +
SupervisorJob() +
CoroutineName("MyCoroutine")
)
scope.launch {
// 使用 IO 调度器,SupervisorJob 模式
println(coroutineContext[CoroutineName]) // MyCoroutine
}
上下文继承与覆盖
val scope = CoroutineScope(Dispatchers.Main)
scope.launch {
println(Thread.currentThread().name) // main
// 覆盖调度器
withContext(Dispatchers.IO) {
println(Thread.currentThread().name) // DefaultDispatcher-worker-1
}
}
实际应用模式
class DataRepository(
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
private val scope = CoroutineScope(SupervisorJob() + ioDispatcher)
suspend fun fetchData(): Result {
return withContext(ioDispatcher) {
// 数据获取逻辑
}
}
fun cancel() {
scope.cancel()
}
}
选择与对比
| 场景 | 推荐作用域 | 推荐调度器 |
|---|---|---|
| Android Activity | lifecycleScope |
Dispatchers.Main |
| Android ViewModel | viewModelScope |
Dispatchers.Main |
| 后台服务 | 自定义 CoroutineScope |
Dispatchers.IO 或 Dispatchers.Default |
| 单元测试 | runBlocking |
Dispatchers.Unconfined 或 TestDispatcher |
| 独立任务 | coroutineScope |
根据任务类型选择 |
| 需要容错 | supervisorScope |
根据任务类型选择 |
更多推荐
所有评论(0)