Z
ZHANK
协程

async/await 并发

async 并发执行、await 等待结果、结构化并发、异常处理

async/await 并发

async 并发执行多个协程,await 等待结果——类似 JS 但更安全。

学完本章你将: 掌握 async 并发、await 结果、结构化并发。


基本用法

kotlin
suspend fun fetchUser(id: Int): String {
    delay(1000)
    return "User $id"
}

fun main() = runBlocking {
    val user1 = async { fetchUser(1) }
    val user2 = async { fetchUser(2) }

    println("${user1.await()} + ${user2.await()}")
    // 两个请求并发执行——总耗时 ~1s 而非 2s
}

懒启动

kotlin
val deferred = async(start = CoroutineStart.LAZY) {
    fetchUser(1)
}
// 还没开始执行...
val result = deferred.await()   // 现在才开始

结构化并发

kotlin
suspend fun loadAll() = coroutineScope {    // 作用域
    val users = async { fetchUsers() }
    val posts = async { fetchPosts() }

    // 任一子协程失败——取消所有兄弟协程
    Data(users.await(), posts.await())
}

异常处理

kotlin
fun main() = runBlocking {
    val handler = CoroutineExceptionHandler { _, e ->
        println("捕获异常: ${e.message}")
    }

    launch(handler) {
        throw RuntimeException("出错了")
    }
    // 不会崩溃——被 handler 捕获
}