前言
前段时间使用了CountDownLatch来做并发流程的控制,在生产上碰到了一些问题,最终问题是解决了,但是那篇文章的评论大家让我用CompletableFuture来试一试,改造完之后,发现CompletableFuture这东西真强大,有种相见恨晚的感觉。
上篇文章
# 以为很熟悉CountDownLatch的使用了,没想到在生产环境翻车了
可以来这篇文章看一下具体的业务场景
CompletableFuture改造
我先直接分享一下我是如何使用CompletableFuture的吧
// 下载文件总数,初始化
List<Integer> resultList = new ArrayList<>(1000);
ConcurrentHashMap<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
IntStream.range(0,1000).forEach(resultList::add);
复制代码
public List<R> sendAsyncBatch(List<P> list, Executor executor, TaskLoader<R,P> loader) {
List<R> resultList = new CopyOnWriteArrayList<>();
if (CollectionUtils.isNotEmpty(list)) {
Executor finalExecutor = executor;
// 将任务拆分分成每50个为一个任务
CollUtil.split(list, 50)
.forEach(tempList -> {
CompletableFuture[] completableFutures = tempList.stream()
.map(p -> CompletableFuture.supplyAsync(() -> {
try {
return loader.load(p);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}, finalExecutor)
.handle((result, throwable) -> {
if (Objects.nonNull(throwable)) {
//log.error("async error:{}", throwable.getMessage());
} else if (Objects.nonNull(result)) {
//log.info("async success:{}", result);
} else {
//log.error("async result is null");
}
return result;
}).whenComplete((r, ex) -> {
i