CompletableFuture是Java8中新增的一个工具类,它实现了Future接口和CompletionStage接口。通过CompletionStage接口,我们可以在一个执行结果上进行多次流式调用,由此得到最终结果。示例:
stage.thenApply(x->square(x)).thenAccept(x->System.out.println(x)).thenRun(()->System.out.println());
1、完成了就通知我
CompletableFuture和Future一样,可以作为函数调用的契约,当向CompletableFuture请求一个数据时,如果数据还未准备好,请求线程就会等待,此外我们还可以手动设置CompletableFuture的完成状态。
2、异步执行任务
使用supplyAsync()构造了一个CompletableFuture实例,它会在一个新线程中,执行传入的参数。calc()方法可能会比较耗时,但这并不影响CompletableFuture实例的构造速度,supplyAsync()会立即返回,返回的CompletableFuture对象就可以作为此次调用的契约,在以后可以用来获取最终的计算结果。如果被业务处理方法没有执行完,则调用future.get()方法的线程就会等待。
CompletableFuture中其他类似的方法定义supplyAsync()用于需要有返回值的场景,runAsync()用于没有返回值的场景。它们各有一个方法可以接收一个Executor参数,可以让Supplier<U>或Runnable在指定的线程池工作。如果不指定则在默认的系统公共的ForkJoinPool.common线程池中执行。
3、流式调用
流式调用示例使用supplyAsync()执行一个异步任务,然后连续使用流式调用对任务的处理结果再加工,直至最后的结果输出。CompletableFuture.get()方法作用是等待calc()执行完成,如果不进行等待,则主函数不等calc()执行完就会退出,所有的Daemon线程都会立即退出,导致calc()无法正常完成。
4、CompletableFuture中的异常处理
如果CompletableFuture在执行过程中遇到异常,可以用函数式编程的风格来处理。它提供了一个异常处理方法exceptionally()。
exceptionally()定义exceptionally()对发生的异常进行处理,如果没有异常则会正常返回结果,否则处理异常并返回一个默认的值。
5、组合多个CompletableFuture
CompletableFuture允许将多个CompletableFuture进行组合。
方式1:使用thenCompose()/thenComposeAsync()方法
一个CompletableFuture可以在执行完成后,将结果通过Function传递给下一个CompletionStage进行处理,Function接口返回新的CompletionStage实例。
方式2:使用thenCombine()/thenCombineAsync()方法
thenCombine()先完成当前CompletableFuture和other的执行,然后将两者的执行结果传递给BiFunction,并返回代表BiFunction实例的CompletableFuture对象。
--参考文献《实战Java高并发程序设计》
网友评论