Skip to content

线程与调度

源:Kotlin Coroutines | Dispatchers

KMP 通过 Kotlin 协程和 Dispatchers 统一了多线程编程,但各平台的线程模型仍有差异。本文展示如何正确使用协程调度器。

平台差异对比

平台主线程IO 线程默认线程
AndroidDispatchers.Main (UI 线程)Dispatchers.IODispatchers.Default
iOSDispatchers.Main (主队列)Dispatchers.DefaultDispatchers.Default
DesktopDispatchers.Main (Swing EDT)Dispatchers.IODispatchers.Default

标准代码块

kotlin
import kotlinx.coroutines.*

class DataRepository {
    
    // IO 操作:网络请求、文件读写
    suspend fun fetchData(): String = withContext(Dispatchers.IO) {
        // 网络请求或文件操作
        delay(1000)
        "Data from server"
    }
    
    // CPU 密集操作:图片处理、加密
    suspend fun processData(data: String): String = withContext(Dispatchers.Default) {
        // CPU 密集计算
        data.uppercase()
    }
    
    // UI 更新:必须在主线程
    suspend fun updateUI(result: String) = withContext(Dispatchers.Main) {
        // 更新 UI
        println("UI updated: $result")
    }
    
    // 完整流程
    suspend fun loadAndDisplay() {
        val data = fetchData()           // IO 线程
        val processed = processData(data) // Default 线程
        updateUI(processed)              // Main 线程
    }
}

依赖补充

kotlinx.coroutines

kotlin
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
        }
        androidMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
        }
        jvmMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.7.3")
        }
    }
}

最新版本:https://github.com/Kotlin/kotlinx.coroutines/releases

实战坑点

iOS Dispatchers.IO 不存在

iOS 无 IO 调度器

iOS 平台无 Dispatchers.IO,应使用 Dispatchers.Default

解决方案:

kotlin
val ioDispatcher = when (Platform.osFamily) {
    OsFamily.IOS -> Dispatchers.Default
    else -> Dispatchers.IO
}