Java8——异步编程( 四 )

这里我们定义了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.runAsyncexceptionally()我们可以使用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 Handlhandle()调用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——异步编程】


推荐阅读