十九、异步任务编排CompletableFuture

一、简介

并发编程中我们经常创建异步线程来执行任务。但是,当异步任务之间存在依赖关系时,使得我们开发过程变得更加复杂。比如:

1、线程2依赖于线程1的执行结果

2、线程3依赖于线程1和线程2执行结果的合并

要实现以上两个异步线程的依赖,我们可能会采用等待/通知、消费队列或者一些比较麻烦的逻辑来控制异步任务的的关系。这期间,你可能不得不考虑中间结果,以及并发临界点等问题。

总而言之,对于复杂的异步任务的控制不是一个容易的事情。

CompletableFuture 

completableFuture是JDK于1.8+提供的一个实现类,它主要用于异步任务的编排,很好地帮我们解决异步任务控制逻辑。

它实现了Future接口和CompletableStage接口,所以你可以像使用Future一样简单地使用CompletableFuture。

JDK文档:https://blog.fondme.cn/apidoc/jdk-1.8-google/java/util/concurrent/CompletableFuture.html

二、使用示例

线程2依赖于线程1的执行结果

// 线程1执行结果
CompletableFuture.supplyAsync(() -> "hello ")
                 // 消费线程1执行结果
                 .thenAccept(x -> System.out.println(x + "world"));

输出结果:

hello world

线程3依赖于线程1和线程2执行结果的合并

// 线程1执行结果
CompletableFuture.supplyAsync(() -> "hello ")
                 // 结合线程2执行结果
                 .thenCombineAsync(CompletableFuture.supplyAsync(() -> "world"), (x, y) -> x + y)
                 // 消费线程1和2的合并结果
                 .thenAccept(x -> System.out.println(x));

输出结果:

hello world

异步任务的编排,实际上是对同步和异步的交点进行了控制,Completable把这个控制逻辑从业务任务代码中抽离了出来。这样你可以更加专注于编写异步任务中的代码。

猜你喜欢

转载自www.cnblogs.com/lay2017/p/10186386.html