这里我们定义了3个CompletableFuture进行一些耗时的任务,此时第一个CompletableFuture会率先完成 。打印结果如下 。
voidCompletableFuture1
异常处理我们了解了CompletableFuture如何异步执行,如何组合不同的CompletableFuture,如何顺序执行CompletableFuture 。那么接下来还有一个重要的一步,就是在执行异步任务时发生异常的话该怎么办 。我们先写个例子 。
CompletableFuture.supplyAsync(()->{ //发生异常 int i = 10/0; return "Success";}).thenRun(()-> System.out.println("thenRun")).thenAccept(v -> System.out.println("thenAccept"));CompletableFuture.runAsync(()-> System.out.println("CompletableFuture.runAsync"));
执行结果为,我们发现只要执行链中有一个发生了异常,那么接下来的链条也就不执行了,但是主流程下的其他CompletableFuture还是会运行的 。
CompletableFuture.runAsync
exceptionally()我们可以使用exceptionally进行异常的处理
//处理异常CompletableFuture<String> exceptionally = CompletableFuture.supplyAsync(() -> { //发生异常 int i = 10 / 0; return "Success";}).exceptionally(e -> { System.out.println(e); return "Exception has Handl";});System.out.println(exceptionally.get());
打印如下,可以发现其接收值是异常信息,也能够返回自定义返回值 。
JAVA.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zeroException has Handl
handle()调用handle()方法也能够捕捉到异常并且自定义返回值,他和exceptionally()方法不同一点是handle()方法无论发没发生异常都会被调用 。例子如下
System.out.println("-------有异常-------");CompletableFuture.supplyAsync(()->{ //发生异常 int i = 10/0; return "Success";}).handle((response,e)->{ System.out.println("Exception:" + e); System.out.println("Response:" + response); return response;});System.out.println("-------无异常-------");CompletableFuture.supplyAsync(()->{ return "Sucess";}).handle((response,e)->{ System.out.println("Exception:" + e); System.out.println("Response:" + response); return response;});
打印如下,我们可以看到在没有发生异常的时候handle()方法也被调用了
-------有异常-------Exception:java.util.concurrent.CompletionException: java.lang.ArithmeticException: / by zeroResponse:null-------无异常-------Exception:nullResponse:Sucess
【Java8——异步编程】
推荐阅读
- 开源JavaScript实用日期处理库——date-fns
- 在浏览器中异步下载文件监听下载进度
- SpringMVC:进阶
- EditPlus——一款小巧功能强大的老牌代码文本编辑器
- 程序员必备技能:设计模式之——组合模式
- CSS样式更改——字体设置Font&边框Border
- 一文全解析——APP版本管理基本知识
- CSS样式更改——文本Content
- 一个漂亮的开源HTML5音乐播放器——APlayer
- 万兆电口网卡体验——安装篇