2019独角兽企业重金招聘Python工程师标准>>>

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

.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。

转载于:https://my.oschina.net/osexp2003/blog/704264

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

  1. WCF透明代理类,动态调用,支持async/await

    我们希望WCF客户端调用采用透明代理方式,不用添加服务引用,也不用Invoke的方式,通过ChannelFactory<>动态产生通道,实现服务接口进行调用,并且支持async/await ...

  2. 【Rust日报】 2019-08-12:Tokio alpha 版发布,新版本支持async/await

    Tokio alpha 版发布 #tokio 新版本支持async/await tokio = "=0.2.0-alpha.1" #![feature(async_await)]u ...

  3. Python 3.5将支持Async/Await异步编程

    根据Python增强提案(PEP) 第0492号, Python 3.5将通过async和await语法增加对协程的支持.该提案目的是使协程成为Python语言的原生特性,并"建立一种普遍. ...

  4. angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  5. Async/Await替代Promise的6个理由

    2019独角兽企业重金招聘Python工程师标准>>> 译者按: Node.js的异步编程方式有效提高了应用性能:然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更 ...

  6. JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  7. [译] JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  8. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!...

    此篇是 JavaScript是如何工作的第四篇,其它三篇可以看这里: JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! JavaScript是如何工作的:深入V8引擎&编写优化 ...

  9. js异步解决方案 --- 回调函数 vs promise vs generater/yield vs async/await

    javascript -- 深度解析异步解决方案 高级语言层出不穷, 然而唯 js 鹤立鸡群, 这要说道js的设计理念, js天生为异步而生, 正如布道者朴灵在 node深入浅出--(有兴趣的可以读一 ...

最新文章

  1. java 格式化解析_java日期格式化、解析
  2. 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码
  3. Linux系统——架构浅析
  4. 【尺取或dp】codeforces C. An impassioned circulation of affection
  5. Android GreenDAO 3.0 不修改版本号的情况下增加、删除表、添加字段
  6. structs 中过滤器问题
  7. fastboot下载慢的一种原因
  8. 日志管理系统之保存日志到数据库
  9. 算法竞赛---day2(等差素数列)
  10. en结尾的单词_形容词加en前后缀变动词的英语单词
  11. 古琴怎么学——【唐畅古琴】
  12. 实验室主机Ubuntu远程控制+自动开关机
  13. java 实现html压缩
  14. Primeng CascadeSelect UI显示BUG解决方案
  15. Spring框架-AOP
  16. 《数据结构与算法》第二版-陈卫卫-陆军工程大学811数据结构教材 第1-2章 参考答案
  17. 基于Scrapy对更新后的Dmoz进行抓取(网上旧版本不靠谱)
  18. 强化网络互连设备安全配置脚本
  19. 插入雷蛇鼠标 2 分钟,即可获得 Windows 10 管理员权限?
  20. NCBI的NT库比对——blastn

热门文章

  1. 右侧快速入口滑动时左侧跟着变化
  2. java--面对对象之final关键字和static关键字
  3. Java8之Stream详解
  4. 部署web应用程序到tomcat
  5. Hadoop伪分布安装详解(四)
  6. Python中布尔类型
  7. [导入]C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.zip(10.41 MB)...
  8. 终于下决心写一写自己的博客了!
  9. Linux上安装wkhtmltopdf,以及调试所遇到的问题
  10. LabVIEW自带函数实现SQL Server操作(上)