首页 > 解决方案 > 为什么 Java 没有 async/await?

问题描述

使用 async/await 可以以命令式风格编写异步函数。这可以极大地方便异步编程。在 C# 中首次引入后,它被 JavaScript、Python 和 Kotlin 等多种语言采用。

EA Async是一个向 Java 添加类似 async/await 的功能的库。该库抽象出使用 CompletableFutures 的复杂性。

但是为什么 async/await 既没有被添加到 Java SE 中,也没有任何计划在未来添加呢?

标签: javaasynchronousasync-awaitcompletable-future

解决方案


简短的回答是,Java 的设计者试图消除对异步方法的需求,而不是促进它们的使用。

根据 Ron Pressler 的谈话,使用 CompletableFuture 进行异步编程会导致三个主要问题。

  1. 无法对异步方法调用的结果进行分支或循环
  2. 堆栈跟踪不能用于识别错误源,分析变得不可能
  3. 它是病毒式的:所有进行异步调用的方法也必须是异步的,即同步和异步世界不能混合

虽然 async/await 解决了第一个问题,但它只能部分解决第二个问题,根本没有解决第三个问题(例如,C# 中执行await的所有方法都必须标记为async)。

但是为什么需要异步编程呢?只是为了防止线程阻塞,因为线程很昂贵。因此,在 Loom 项目中,Java 设计人员没有在 Java 中引入 async/await,而是致力于虚拟线程(又名纤程/轻量级线程),旨在显着降低线程成本,从而消除对异步编程的需求。这将使上述所有三个问题也都过时了。


推荐阅读