Kotlin面试题更新 2026-08-03

在 Kotlin 协程中,launch 与 async 这两个构建器在行为上有何不同?它们分别适用于哪些典型场景?

考察说明

考查对 Kotlin 协程中 launch 与 async 构建器差异及适用场景的理解。

回答思路

  1. 【回答框架 1】launch 和 async 都是 CoroutineScope 的扩展函数,用于启动新的协程。核心区别在于返回类型:launch 返回 Job,不产生结果;async 返回 Deferred,Deferred 继承自 Job,且可以通过 await() 获取最终结果或异常。
  2. 【回答框架 2】从执行行为看,两者默认都是立即调度执行(除非指定启动模式),但 launch 通常用于执行无需返回值的任务,如 UI 刷新、日志记录;async 用于需要并行计算并返回结果的场景。
  3. 【回答框架 3】在异常处理上,launch 中的异常会直接抛出到协程的上下文异常处理器或父协程;async 中的异常通常被封装在 Deferred 中,直到调用 await() 时才抛出,若未调用 await(),异常可能被吞掉,需注意。
  4. 【回答框架 4】结构化并发方面,两者都遵循协程作用域的生命周期:在协程作用域内启动的协程会等待其完成(除非使用 SupervisorJob)。使用 async 时,若父作用域取消,子协程也会取消。
  5. 【回答框架 5】使用场景:launch 适合 '即发即忘' 型任务,如网络请求后的 UI 更新、数据持久化等;async 适合需要并发执行多个任务并汇总结果的场景,如同时获取多个接口数据,或并行执行 CPU 密集型计算。
  6. 【关键点 1】launch 无返回值,async 有 Deferred 返回值。
  7. 【关键点 2】async 可通过 await() 获取结果,错误处理时机不同于 launch。
  8. 【关键点 3】选择依据:有无返回值需求,或需要并发聚合结果。
  9. 【易错点 1】错误使用 async 而不调用 await() 可能导致异常被静默吞掉。
  10. 【易错点 2】误以为 async 是并行执行,实际若在同一线程上下文,可能顺序执行,并行需调度器支持。
  11. 【易错点 3】忽略结构化并发,在全局作用域使用可能导致协程泄漏。