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) -> {
if (Objects.nonNull(r)) {
resultList.add((R) r);
}
})
).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(completableFutures).join();
System.