CompletableFuture多线程聚合示例
详情参考:https://blog.csdn.net/weixin_46217160/article/details/124945250
在Java 8中, 新增加了一个包含50个方法左右的类: CompletableFuture,结合了Future的优点,提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。
CompletableFuture被设计在Java中进行异步编程。异步编程意味着在主线程之外创建一个独立的线程,与主线程分隔开,并在上面运行一个非阻塞的任务,然后通知主线程进展,成功或者失败。
通过这种方式,你的主线程不用为了任务的完成而阻塞/等待,你可以用主线程去并行执行其他的任务。 使用这种并行方式,极大地提升了程序的表现。
/**
* 多线程聚合示例:
* 筛选字符串中包含"a"的字符串,并聚合结果;
* @param args
*/
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(10);
String linkCode = "aaa,abc,bbb,ccc,ddda,abb,aaacccc";
List<String> list = Arrays.asList(linkCode.split(","));
List<String> newList = new ArrayList<>();
List<CompletableFuture<String>> futureList = new ArrayList<>();
for(String item : list){
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> {
if (item.contains("a")) {
return item;
}
return "";
}, threadPool);
futureList.add(a);
}
CompletableFuture[] futureArray = futureList.toArray(new CompletableFuture[futureList.size()]);
CompletableFuture<Void> allFutureResult = CompletableFuture.allOf(futureArray).whenComplete((v, e) -> {
futureList.forEach(x -> {
String newStr = x.getNow(new String());
if (StringUtils.isNotEmpty(newStr)) {
newList.add(newStr);
}
});
});
allFutureResult.join();
System.out.println(JSON.toJSONString(newList));
}