java - 为什么 Java 没有 async/await?
问题描述
使用 async/await 可以以命令式风格编写异步函数。这可以极大地方便异步编程。在 C# 中首次引入后,它被 JavaScript、Python 和 Kotlin 等多种语言采用。
EA Async是一个向 Java 添加类似 async/await 的功能的库。该库抽象出使用 CompletableFutures 的复杂性。
但是为什么 async/await 既没有被添加到 Java SE 中,也没有任何计划在未来添加呢?
解决方案
简短的回答是,Java 的设计者试图消除对异步方法的需求,而不是促进它们的使用。
根据 Ron Pressler 的谈话,使用 CompletableFuture 进行异步编程会导致三个主要问题。
- 无法对异步方法调用的结果进行分支或循环
- 堆栈跟踪不能用于识别错误源,分析变得不可能
- 它是病毒式的:所有进行异步调用的方法也必须是异步的,即同步和异步世界不能混合
虽然 async/await 解决了第一个问题,但它只能部分解决第二个问题,根本没有解决第三个问题(例如,C# 中执行await的所有方法都必须标记为async)。
但是为什么需要异步编程呢?只是为了防止线程阻塞,因为线程很昂贵。因此,在 Loom 项目中,Java 设计人员没有在 Java 中引入 async/await,而是致力于虚拟线程(又名纤程/轻量级线程),旨在显着降低线程成本,从而消除对异步编程的需求。这将使上述所有三个问题也都过时了。
推荐阅读
- reactjs - 如何使用 Formik 实现我的自定义 Google 地图组件的 SetFieldValue
- angular - Angular Material Dialogue 问题 - 错误:选择器“dialog-result-example-dialog”与任何元素都不匹配
- amazon-web-services - 针对单并发微服务组合优化 SQS Lambda 配置
- node.js - 从节点 js 导出 CSV 而不会崩溃
- json - 是否可以使用 JSONPath 从 JSON 数组中获取属性值的排序列表
- azure - Azure Blob 存储中的静态网站:如何启用 Azure AD 身份验证?
- c# - ASP.NET Core 验证浮点范围问题
- javascript - 通过DOM向html标签元素添加事件
- python - 如何删除多对多孤儿
- c# - I can't see the input value in the input in html controller