五、异步任务编排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把这个控制逻辑从业务任务代码中抽离了出来。这样你可以更加专注于编写异步任务中的代码。