美文网首页工作生活
Java8增强的Future:CompletableFuture

Java8增强的Future:CompletableFuture

作者: 夏与清风 | 来源:发表于2019-07-04 20:09 被阅读0次

    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高并发程序设计》

    相关文章

      网友评论

        本文标题:Java8增强的Future:CompletableFuture

        本文链接:https://www.haomeiwen.com/subject/muifhctx.html