为什么Java没有异步/等待?
使用async/await,可以以命令式风格编写异步函数。这可以极大地促进异步编程。在C#中首次引入后,它被许多语言采用,如JavaScript、Python和Kotlin 是一个向Java添加异步/等待功能的库。该库抽象了使用CompletableFutures的复杂性为什么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既没有添加到Java SE中,也没有计划在将来添加它呢?简单的回答是,Java的设计者试图消除对异步方法的需要,而不是简化它们的使用 根据Ron Pressler的异步编程,使用CompletableFuture会导致三个主要问题
但为什么需要异步编程呢?只是为了防止线程阻塞,因为线程非常昂贵。因此,在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同步会更好吗??