外观
Kotlin 协程与 Java 并发如何对应?
标准回答
协程挂起可以保存执行状态并让出线程,但调用阻塞 API 或长计算仍会占用实际线程。Dispatcher 决定调度环境,不能把 suspend 关键字当作自动 I/O 或线程切换。Java Executor / Future 与协程都需要并发预算和取消协议。
结构化并发让子任务归属某个作用域,父任务取消可传播。任务要在挂起点或主动检查处响应取消,资源用 finally 等机制释放;吞掉取消异常可能让已经失效的工作继续运行。Supervisor 的失败隔离也不意味着所有错误可以忽略。
Android 中选择与页面或业务任务匹配的作用域,UI 更新在适当线程完成。协程切换不能代替服务端幂等,超时也不证明远端副作用停止。已有 Java 经验可以沿所有权、等待、可见性和取消四个概念迁移。
追问与回答
launch 和 async 的区别在哪里
前者返回 Job 表达生命周期,后者返回可 await 的 Deferred 结果;异常传播仍与作用域和父子关系有关,不应仅理解为是否返回值。
并行两个请求是否都用 async 就够
还需定义失败时是否取消另一支、总体期限、最大并发和结果使用条件,避免创建后无人等待的任务。
易混淆点
- 把挂起函数看成一定不会阻塞调用线程。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q198