文档章节

Java什么时候提高境界支持async/await写法啊?

Q_J
 Q_J
发布于 2016/07/01 17:00
字数 1119
阅读 645
收藏 0

异步编程的最高境界,就是根本不用关心它是不是异步

.NET的async/await方式最先达到了这个境界。

和async/await写法相比,Java的什么ExecutorService以及回调之类设计都是惭愧无比的。当然,习惯了也没啥,反正那Java的lamda表达式用着也可以接受。

人不知道更好的东西的时候其实也就无所谓难受,更何况现在Java强势,.NET就算有好东西也发不出太大的影响...

不过可以想象,如果Java9支持了这个写法,那么那些RxJava什么的和回调有关系的各种lib都会成为二等公民(对于某数据流式处理还是需要的)。

其实那么多牛人,怎么会想不到这点呢,为啥还不改呢?也许是不想承受抄袭的骂名,而是想改得直接超越.NET的,也许是专利限制,谁知道呢。

想来又不是要改JVM,只是改点编译器罢,支持把await的后的代码自动编程回调函数,再把系统的一些费时间的method给多封装一个返回AsyncResult<SomeReturnType>之类的method,多大的事儿啊,改了吧。

那些getter/setter不支持的事儿就不和你计较了,反正还有个Lombk预编译加上@Gettr/@Setter之类的就可以了。可这个async/await不然,就不容易由第三方用类似的方法实现了。


顺便普及一下async+await是如何优雅的,最自然的语法,天才的想法。思路大致是这样:

  1. 假设先做个很重的API,为了异步,那就立刻返回一个AsyncResult<真实返回类型>,就是不是立刻得到结果的那种,同时在单独的线程池里执行本来的动作。 一般的编程模式是,让用户通过回调来处理结果:
string someFunction() {
    AsyncResult<真实返回值类型> asyncResult = someApi(...);
    asyncResult.onComplete( 真实结果 -> {
        ...对结果的处理...
    } );
    return something;
}
  1. 就在这时,有哪位聪明人,觉得可以让编译器作者事儿,只要代码里加个标记就行了,这就是await的登场了
string someFunction() {
    真实返回值类型> result = await someApi(...);
    ...对结果的处理...
    return something;
}

相当于编译器自动把await语句后面的知道函数末尾的所有语句都编译成了一个临时的Lamda表达式了。 3. 但是这样一来,异步的特性会逐层传染,当前所在的函数someFunction也就立刻返回了,那到底返回成什么好呢,这就是async的登场了。

async string someFunction() {
    真实返回值类型> result = await someApi(...);
    ...对结果的处理...
    return something;
}

这就是告诉编译器,谁要是调用someFunction,他也必须用await罩一下。

string x = await someFunction()
...

就这么想着想着改巴改巴就成了。

更具体的,就随手转帖一个有关.NET async/await的实现背后 « 司维的思维


async/await多美啊,实在符合自然思维,看到await,就明白后面的代码会等会儿再执行,暂时可以回家吃饭去了。

但是,也有缺点,await只能取得一个结果,然后就不搞了。 这对于陆陆续续出若干个结果的API,就没什么作用,难道把一个流作为返回值,那最终,还是需要RxJava那种针对流处理的Publisher/Subscriber+Callback的方式。 这就是yield的登场了,它没有async/await直观好懂,就不多说了。

顺便转个 JavaScript async/await 函数的含义和用法 - 阮一峰的网络日志,里面也有提到yield,看看就知道了。


真想不到以前弱弱的Java和JavaScript成长到现在这么强大,真真是凝聚着无数高手们的心血,硬是挤得.NET直哆嗦(即使.NET在实现上依然优于Java,但是事儿不是那么单纯的)。真是白让我以前那么喜欢.NET。

© 著作权归作者所有

共有 人打赏支持
Q_J

Q_J

粉丝 12
博文 67
码字总数 54682
作品 0
日本
私信 提问
C# vs Java:C# 五个不可替代的特性瞬间秒杀 Java

如果我们可以同时拥有 C# 和 Java 世界的最好特性,那会是什么样呢? 完美的编程语言并不存在,我希望我们可以在这一点上达成一致。开发新语言往往是为了克服另一种语言的弊端,又不可避免的...

oschina
2017/08/10
1K
2
挑战 Java 霸主之位?C井 五个不可替代的特性瞬间秒杀 Java

完美的编程语言并不存在,相信这一点在众多开发者的心中毋庸置疑。想要学会一门编程语言就走遍天下,至少目前看来并不现实。一门新语言的诞生往往是为了克服另一种语言的弊端,但在保证新语言...

jamesese
2018/10/22
0
0
Eclipse 基金会新增一员:红帽将把 Ceylon 移交给它

红帽公司计划将 Ceylon 语言移交至 Eclipse 基金会,目前该提案已获批准,Eclipse Ceylon 项目也已被创建。 背景: Eclipse Ceylon 是一门现代的静态类型编程语言,支持与 Java, Android 和 ...

局长
2017/08/21
2.5K
7
JavaScript异步编程史:回调函数到Promise到Async/Await

摘要: 异步编程时JavaScript以及Node.js的一大亮点,其中有什么心酸的黑历史呢? 原文: Async programming basics every JS developer should know in 2018 译者:Fundebug 为了保证可读性,...

Fundebug
2018/07/13
0
0
深入浅出ES6教程『async函数』

大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Symbol & generator的用法,下面我们一起来继续学习async函数: async [ə'zɪŋk]:这个单词看起来很怪异,它的...

__苏日俪格
2018/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS 调用Angularjs 的方法

// 1. 获取 Controllerlet appElement = document.querySelector('[data-ng-controller=MessagesCtrl]');let scope = angular.element(appElement).scope();// 2. 调用方法scope.l......

Moks角木
18分钟前
0
0
dubbo+zookeeper与 eureka的区别

CAP CAP 原则指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 在分布式架构里, P必须有 Zookeeper保证C P 当...

群星纪元
28分钟前
0
0
云计算之边缘计算大势所趋

如果说边缘计算是公同认定的目标,那么我们看到,不同类型的厂商基于自身的特点,会从不同的起点、沿着不同的路径,向这个目标奔跑。上次参加阿里云的一次活动,看到他们将边缘计算的厂商分成...

linuxCool
32分钟前
0
0
前端通过后端传过来的'\n' ,''等字符串换行失败问题

后台推送换行符 '\n' 或 '<br/>' 等字符串到前台不会换行 详细描述 后台逻辑处理返回String字符串,其中包含\n或<br/>等换行符号,但是前端渲染时候却并没有真正的换行 也尝试了大佬的各种 ...

下次用oschina
39分钟前
2
0
volatile能保证有序性吗?

在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。   volatile关键字禁止指令重排序有两层意思:   1)当程序执行到volatile变量的读操作或者写操作时...

无精疯
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部