写同步代码,跑出异步效果。100 万协程也不挂。
需求:拿用户、订单、支付三个数据。每个 IO 大约 500ms。
val u = fetchUser() // 500ms
val o = fetchOrders() // 500ms
val p = fetchPayment() // 500ms
// 总: 1500ms
val u = async { fetchUser() } // 同时启动
val o = async { fetchOrders() }
val p = async { fetchPayment() }
val all = listOf(u, o, p).awaitAll()
// 总: max(500ms) = 500ms
repeat(10_000) {
Thread {
Thread.sleep(1000)
// 模拟 IO
}.start()
}
runBlocking {
repeat(10_000) {
launch {
delay(1000)
// 模拟 IO
}
}
}
| 并发任务数 | Thread | 协程 |
|---|---|---|
| 100 | 200ms | 110ms |
| 10,000 | OOM | 1.2s |
| 1,000,000 | 不可能 | 3.5s |
编译器把 suspend 函数变成"状态机",每次挂起都保存当前状态。
suspend fun loadUser(): User {
val data = fetchData() // suspend 调用 1
val parsed = parseJson(data) // suspend 调用 2
return User(parsed)
}
continuation.resume(result)Flow 像 RxJava 的 Observable + suspend,每秒发出一个值。
flow { for (i in 1..6) { delay(800); emit(i) } }
.filter { it % 2 == 0 }
.map { it * 10 }
.collect { println(it) }
| 类型 | 冷热 | 典型场景 |
|---|---|---|
Flow | 冷 | 一次性数据流(DB 查询、网络请求) |
StateFlow | 热(保留当前值) | UI 状态(loading/success/error) |
SharedFlow | 热 | 事件广播(toast、navigate) |