一、协程 vs 线程线程操作系统调度创建成本高约1MB栈内存协程用户态调度创建成本极低约几KB可创建数十万个// Java 线程10000个线程会OOM for (int i 0; i 10000; i) { new Thread(() - doWork()).start(); } // Kotlin 协程100000个协程轻松运行 repeat(100_000) { GlobalScope.launch { doWork() } }回到顶部二、第一个协程import kotlinx.coroutines.* fun main() runBlocking { // 启动协程 launch { delay(1000) // 非阻塞延迟 println(World!) } println(Hello,) } // 输出 // Hello, // (1秒后) World!回到顶部三、协程作用域CoroutineScope// 1. GlobalScope全局作用域生命周期跟随应用 GlobalScope.launch { println(Global scope) } // 2. runBlocking阻塞当前线程直到协程完成 runBlocking { launch { println(runBlocking) } } // 3. coroutineScope挂起当前协程等待子协程完成 suspend fun loadData() coroutineScope { launch { fetchUser() } launch { fetchOrders() } } // 4. ViewModelScopeAndroid跟随 ViewModel 生命周期 viewModelScope.launch { val data repository.fetchData() updateUI(data) }回到顶部四、挂起函数suspend// 挂起函数可在协程中暂停执行不阻塞线程 suspend fun fetchUser(): User { return withContext(Dispatchers.IO) { // 切换到 IO 线程执行网络请求 api.getUser() } } // 调用挂起函数 fun loadData() viewModelScope.launch { showLoading() val user fetchUser() // 挂起等待结果 updateUI(user) // 恢复执行 hideLoading() }回到顶部五、协程调度器Dispatcher// 1. Dispatchers.Main主线程UI 操作 withContext(Dispatchers.Main) { textView.text Updated } // 2. Dispatchers.IOIO 密集型网络、数据库 withContext(Dispatchers.IO) { val data api.fetchData() database.save(data) } // 3. Dispatchers.DefaultCPU 密集型排序、计算 withContext(Dispatchers.Default) { val sorted list.sortedBy { it.id } } // 4. 自定义线程池 val customDispatcher Executors.newFixedThreadPool(4).asCoroutineDispatcher() withContext(customDispatcher) { heavyComputation() }回到顶部六、异常处理// CoroutineExceptionHandler全局异常捕获 val handler CoroutineExceptionHandler { _, e - println(Caught: $e) } val job GlobalScope.launch(handler) { throw RuntimeException(Error!) } // try-catch局部异常处理 try { val result async { riskyOperation() }.await() } catch (e: Exception) { handleError(e) }回到顶部七、实战并发请求data class User(val id: Int, val name: String) data class Order(val id: Int, val userId: Int) suspend fun loadUserData(userId: Int): PairUser, ListOrder { return coroutineScope { // 并发执行两个请求 val userDeferred async { fetchUser(userId) } val ordersDeferred async { fetchOrders(userId) } // 等待结果 Pair(userDeferred.await(), ordersDeferred.await()) } } // 对比 Java CompletableFuture // Kotlin 协程写法更简洁无需回调链回到顶部总结Kotlin 协程让并发编程变得优雅。核心要点轻量级可创建数十万协程而不 OOM