为什么Java没有异步/等待?

为什么Java没有异步/等待?,java,asynchronous,async-await,completable-future,Java,Asynchronous,Async Await,Completable Future,使用async/await,可以以命令式风格编写异步函数。这可以极大地促进异步编程。在C#中首次引入后,它被许多语言采用,如JavaScript、Python和Kotlin 是一个向Java添加异步/等待功能的库。该库抽象了使用CompletableFutures的复杂性 但是为什么async/await既没有添加到Java SE中,也没有计划在将来添加它呢?简单的回答是,Java的设计者试图消除对异步方法的需要,而不是简化它们的使用 根据Ron Pressler的异步编程,使用Completa

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

是一个向Java添加异步/等待功能的库。该库抽象了使用CompletableFutures的复杂性


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

简单的回答是,Java的设计者试图消除对异步方法的需要,而不是简化它们的使用

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

  • 不可能对异步方法调用的结果进行分支或循环
  • stacktraces无法用于识别错误源,因此无法进行分析
  • 它是病毒性的:所有进行异步调用的方法也必须是异步的,即同步和异步世界不能混合
  • 虽然async/await解决了第一个问题,但它只能部分解决第二个问题,根本无法解决第三个问题(例如,C#中所有执行await的方法都必须标记为async)


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

    光纤听起来像线程,但不让程序员做那么多。基于这种描述,这似乎是一种净损失。这种说法是非常固执己见的。对于1),async/await使其成为非问题;如果没有它们,您将使用
    TaskCompletionSource
    (例如,不带lambda的
    CompletableFuture
    ),在内部处理条件和循环,并根据需要完成此对象。对于2),运行时关联堆栈跟踪,IDE理解它,因此没有太大问题;即使没有相关性,您仍然会看到CPU瓶颈。对于3),如果你没有一直使用async,那么你就在某个地方阻塞了,因此病毒传播在任何方面都与异步性有关,而不是与async/await有关。至于在C#中使用
    async
    标记方法,这主要与识别上下文
    await
    关键字有关。编译的方法没有任何异步标志。至于光纤,它们需要每个本机库或底层托管运行时的支持。在某种程度上,光纤支持也是“病毒式”的,但却是消极的:几乎没有人关心他们的库或运行时是否与光纤不兼容。您忘记了异步/等待背后的主要原因:代码可读性。在复杂的应用程序中,如果发生大量异步调用(如http后端调用),而没有使用async/await,那么最终将得到这种带有调用链的意大利面条式代码。它很难阅读、调试和理解。使用async/await模式,您最终会得到一个外观美观的同步编解码器#have Task,Java将以异步方式而不是同步方式工作得更快???,与fabric同步会更好吗??