编写异步代码很困难。 试图了解异步代码应该做什么的难度更大。 承诺是尝试描述延迟执行流程的一种常见方式:首先做一件事,然后再做另一件事,以防万一出错再做其他事情。

在许多语言中,承诺已成为协调异步行为的事实上的方法。 Java 8终于有了该程序,并引入了CompletableFuture; 尽管很认真,但谁设计了API? 一团糟

许诺的麻烦在于,控制流程可能变得非常简单。 随着控制流程变得越来越复杂,几乎变得难以理解(执行此操作,然后,除非是星期三,否则,请执行此操作,如果有错误,请返回三个空格,yada yada yada)。

很酷的孩子们已经开始使用异步…等待。 C#拥有它。 JavaScript有它。 现在……现在,通过EA的一些大才能,Java拥有了它! 是的,Java具有可用的async ... await构造,而无需更改语言!

一个简单的例子:我们可以使用CompletableFuture编写几个异步操作,如下所示:

private static void theOldWay() {doAThing().thenCompose(Main::doAnotherThing).thenAccept(Main::reportSuccess).exceptionally(Main::reportFailure);
}

这应该很简单,通常使用期货代码与这个简单代码相去甚远。 但是,借助EA异步等待的魔力,我们可以像这样重新编写它:

private static CompletableFuture<Void> theNewWay() {try {String intermediate = await(doAThing());String result = await(doAnotherThing(intermediate));reportSuccess(result);} catch (Throwable t) {reportFailure(t);}return completedFuture(null);
}

看起来像同步代码。 但是对Async.await的调用是神奇的。 这些调用被重新编写(在运行时或构建时,如您所愿),以使调用无阻塞!

该代码更易于编写,易于阅读,易于调试一百万倍,最重要的是它可以自然扩展。 随着代码变得越来越复杂,您可以使用常规的重构工具来控制它。 使用CompletableFutures,您最终会绕过所有这些将来的对象,并且在某个地方,有一天您会错过代码路径和繁荣! 生产中的一个免费错误。

因此,即使您坚持使用Java,您仍然可以像酷孩子一样使用async…await!

翻译自: https://www.javacodegeeks.com/2018/02/async-await-java.html

Java中的异步等待相关推荐

  1. java for循环 等待_在forEach循环中使用异步/等待

    在forEach循环中使用async / await是否有任何问题? 我正在尝试遍历文件数组并await每个文件的内容. import fs from 'fs-promise' async funct ...

  2. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  3. JAVA中的异步调用

    1.什么是异步调用 异步调用简单理解,就是不阻塞主线程,再开辟另一个线程异步执行 main{//前置语句costTime();//后置语句 } 在上述代码中,主线程按顺序,需要依次执行前置语句,调用c ...

  4. java 线程等待_代码分析Java中线程的等待与唤醒

    我们先来看一下实例代码: class ThreadA extends Thread{ public ThreadA(String name) { super(name); } public void ...

  5. 了解Javascript中的异步等待

    在本文中,我们将探讨async/await对于每个Javascript开发人员来说,异步编程的首选工具.如果您不熟悉javascript,请不要担心,本文将帮助您async/await从头开始理解. ...

  6. java 异步返回_在Java中使用异步后,主方法如何返回异步中得到的值?

    慕莱坞5435954 我没有研究过 RxJava,不过之前团队里面做 Android 的开发的同事说是很好用.1 楼给了一种使用 Future 的方案,但是很抱歉 Future 是一种异步阻塞式的AP ...

  7. java中的线程等待

    1 thread.join() 使用.join方法时需要进行加锁,当线程调用.join()方法时,调用此方法的线程会被阻塞在方法调用处,等到等待的线程执行完毕或者运行超时的时候,便会会释放掉锁,调用此 ...

  8. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  9. python 异步io_Python中的异步IO:完整的演练

    python 异步io Async IO is a concurrent programming design that has received dedicated support in Pytho ...

最新文章

  1. Oracle表数据恢复
  2. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  3. 将数据归一化到任意区间范围的方法
  4. 你买的元器件是原装还是翻新?这里有一份攻略。
  5. Collection 和 Collections区别
  6. animate css3 应用的借鉴,一个同事写的JS
  7. 计算机组成原理电子时钟设计与实现,《计算机组成原理》课程设计报告-基于VHDL数字电子钟设计与实现.doc...
  8. java的ssh获取id,使用SSH公钥(id_dsa.pub)实现免密码登录
  9. js常用插件(八)之移动端滑动插件swiper,BScroll
  10. 「上海院子」打造不可复制的国宅风华
  11. 知道tan值怎么求角度不用计算机,已知sin,cos,tan的值,如何使用计算器求出相应的角度...
  12. 【HDLBits刷题笔记】Exams/ece241 2013 q7
  13. 移动互联网时代的创业机会
  14. Android显示——一帧的渲染过程(VSYNC)
  15. tf.keras.metrics.Accuracy;tf.keras.metrics.Precision;tf.keras.metrics.Recall
  16. 解决Vue Disconnected from UI server errno: -4058, syscall: ‘scandir‘, code: ‘ENOENT‘,
  17. linux nvme文件系统,Intel NVMe驱动器扇区大小不是4096的xfs文件系统的性能下降
  18. 多wan口路由器,如何实现域名解析?
  19. 限期解除!要跟乱七八糟的口令说拜拜了
  20. 312页18万字数字化校园总体建设方案

热门文章

  1. 汇编语言(二)之数值求和
  2. 一次惊险的跳槽面试经历(阿里/美团/头条/网易/有赞...)
  3. Redis进阶之内存模型
  4. 80%的程序员都不了解的调试技巧
  5. Java动态代理之cglib
  6. URL的getFile()和getPath()方法的区别
  7. 《走遍中国》珍藏版(六)
  8. 第一章数据库系统基础
  9. 使用JDBCTemplate实现与Spring结合,方法公用
  10. JS中的map函数(会改变不是基本类型的数组的值)