上面一篇介绍了一下CompletableFuture的各种方法,软软猿妹还想要看更多Demo示例,那么今天就安排起来!
1 CompletableFuture的静态方法使用
CompleteableFuture的静态方法有如下,
之前的文章里面已经讲过suuplyAsync,以及runAsync。
delayedExcutor
delayedExcutor其作用是构建一个延迟执行任务的Excutor,默认使用ForkJoinPool. 也可以使用自定义的Excutor。
1 |
|
allof和anyof
allof和anyof 为等待多个CompletableFuture完成之后返回一个CompletableFuture,allof返回无result,anyof返回为最先完成的CompletableFuture。可以看如下示例。
1 |
|
执行结果如下:
1 |
|
failedStage和failedFuture是返回一个已知异常的CompletableFuture。这个下面和其他异常一起举例。
2 CompletableFuture的其余方法使用
CompletableFuture中方法可以大致分为run,apply,accept几个类别。 其对应的参数分别为Runnable,Function,Consummer等几个函数式表达式。
-
run代表当前CompletableFuture完成后执行的一些列操作,无输入参数,无返回结果,所以只是Runnable为参数。()-> { option }
-
apply代表以当前CompletableFuture完成后的结果为参数进行的操作,并且会返回一个新的CompletableFuture,所以以Function为参数。(s)-> {return s;}
-
accept代表以当前CompletableFuture完成后的结果为参数,执行的操作,无返回结果,直接消费。以consumer为参数,(s)-> { option }。
2.1 Run方法
1 |
|
上述执行结果:
1 |
|
apply 与accept相关的方法类似,此处不一一举例了。
下面我们根据一些情景举例来说明方法如何使用:
2.2 多个 CompletableFuture组合在一起执行
情景一:先去取快递,然后再去买菜,然后回家做饭。
1 |
|
下面看一下上面的执行结果,
1 |
|
可以看到最后一行输出的时间比较早,这是因为join会阻塞线程,直到此CompletableFuture执行完并获取到值。
情景二:和女朋友一起出门,我去取快递,女朋友去买菜,然后一起回家做饭。
1 |
|
此处使用 thenAcceptBoth 需要在两个CompletableFuture都完成的情况下,才能执行,所以最后使用join()使其阻塞到可以执行当前的操作。
情景三:和女朋友一起出门,我去取快递,女朋友去买菜,谁先弄完谁就先回去。
1 |
|
我先拿到了快递,就快快的回家了,然后就挨了一顿毒打。
2.3 在两个CompletableFuture运行后再次计算
晚饭过后和女朋友讨论做什么事情,然而发生了分歧:
1 |
|
4 CompletableFuture的异常处理
CompletableFuture和异常相关的方法有如下
4.1 whenComplete/whenCompleteAsync
1 |
|
whenCompletable使用有BiConsumer里面会有两个参数,下边是一个示例。参数需要两个分别为str,exception, 如果有异常exception有值,str为null。如果stringCompletableFuture正常完成,则exception为null。但是不管是否有异常,表达式里面的方法均会执行。
有点类似try finally{},有没有异常均可执行。
1 |
|
4.2 exceptionally
exceptionally方法中为一个Function参数,需要一个输入值,为当前CompletableFuture抛出的异常。
其返回值有两个结果:
1 |
|
1 |
|
上述示例无异常抛出时结果如下:
1 |
|
有异常抛出时结果如下:
1 |
|
4.3 handle/handleAsync
1 |
|
handle 和 whenComplete 比较类似,无论有没有异常,里面的方法均会执行到。
但是有有一些区别,handle参数为BiFunction,有返回值,whenComplet的参数为BiComsumer 无返回值。
下面的实例中,如果有异常则参数中的str为null,如果没有异常exception为null。
1 |
|
有异常的执行结果:
1 |
|
无异常的执行结果
1 |
|
4.4 failedStage/failedFuture
failedStage和failedFuture均为静态方法,会返回一个已完成的给定异常的CompletableFuture,
failedStage返回的是CompletionStage,failedFuture返回为CompletableFuture对象
1 |
|
最后给一个可以直接食用的示例,可以根据不同的需求进行改良!
1 |
|
总结
本片用了一些示例来讲解CompletableFuture,我们可以在开发中的一些场景中使用起来了。特别是异步多线程去拿一些数据的时候,非常好用哦。
更多的Demo,请看github地址:https://github.com/javatechnorth/java-study-note/tree/master/multiThread/src/main/java/org/javanorth/currency/completableFuture