CompletableFuture异步编排工具
前言
先看下介绍:
- CompletableFuture是Java 8中新增的一个类,用于异步编程和函数式编程。它提供了一种简单的方法来处理异步任务的结果,支持链式调用和组合多个异步任务的结果
- CompletableFuture类实现了Future和CompletionStage接口,可以用来表示异步任务的结果,同时还提供了一些方法来处理异步任务的结果,如whenComplete、thenApply、thenAccept、thenCombine等。这些方法可以通过Lambda表达式来实现回调函数,从而方便地处理异步任务的结果
- CompletableFuture还支持异步计算、超时和异常处理等功能,可以帮助开发人员更加方便地实现高效的异步编程。它是Java 8中非常重要的一个类,也是Java异步编程的重要组成部分之一
正文
大白话在介绍一遍, 异步多线程大家都用过吧, 像 @Async , 线程池 , Thread , Runnable , Callable和FutureTask 等等 都能实现并行执行 , 如果只是简单的功能用这些倒还是可以, 但要想实现稍微复杂一点的功能, 比如我想串行去查询 A,B,C 三个业务的结果 ,然后统一返回后做统一处理, 或者 串行查询 A,B,C ,但是 C 需要得到 A 的返回结果在执行, B 不影响 . 像以前 ,也能实现, 但就是比较麻烦, 还要写一堆, 而CompletableFuture 却只需要几行代码就能够完成, 爽的一批
已经有大佬的文章有很详细的使用介绍了, 直接用, [传送门]
我这就在贴一下自己使用到的情况案例, 前端传进来一个主设备, 我需要拿到这个主设备ID去查询下面的很多子设备, 并统一等待返回结果打包处理. 所以这里我就用到了CompletableFuture ,这里都是查询, 不涉及到线程安全问题
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureWithForLoopExample {
public static void main(String[] args) {
List<CompletableFuture<String>> futures = new ArrayList<>();
// 创建多个CompletableFuture对象,并添加到集合中
for (int i = 0; i < 5; i++) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> task(i));
futures.add(future);
}
//将所有异步线程放入allOf中, 做集中管理, 看源码可知, 这里参数是个可变参数
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try {
allFutures.get(); // 等待所有任务完成
// 获取每个任务的结果
for (CompletableFuture<String> future : futures) {
String result = future.get();
System.out.println("Result: " + result);
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
public static String task(int i) {
// 任务的逻辑
return "Task " + i + " completed";
}
}