1、CompletableFuture异步调用具体步骤
1、先定义集合
List<CompletableFuture<T>> futures = Lists.newArrayList();
2、获取单个方法的结果
private CompletableFuture<T> getT(T t) {
return CompletableFuture.completedFuture(id).thenApplyAsync(v -> {
return t;
}, threadPoolService.getThreadPoolExecutor()).exceptionally(e -> null);
}
3、等待所有结果 Java CompletableFuture:allOf等待所有线程任务结束
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
4、最后封装得到自己的结果,遍历futures
2、具体的调用demo
//写出获取单个实体的表达式
private CompletableFuture<TransferDecisionVO> getTransferDecisionVO(TransferDecisionBO bo) {
Long id = bo.getTransferDecisionDO().getId();
return CompletableFuture.completedFuture(id).thenApplyAsync(v -> {
TransferDecisionBO detail = transferDecisionManager.detail(id);
return TransferDecisionConverter.convert(detail);
}, threadPoolService.getThreadPoolExecutor()).exceptionally(e -> null);
}
DecisionPage<TransferDecisionBO> page = transferDecisionManager
.pageTransferDecision(TransferDecisionConverter.convert(req));
List<TransferDecisionBO> results = page.getResults();
if (CollectionUtils.isEmpty(results)) {
return;
}
List<TransferDecisionModel> model = Lists.newArrayList();
List<CompletableFuture<TransferDecisionVO>> futures = Lists.newArrayList();
for (TransferDecisionBO bo : results) {
futures.add(getTransferDecisionVO(bo));
}
//异步执行 Java CompletableFuture:allOf等待所有线程任务结束
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
for (CompletableFuture<TransferDecisionVO> completableFuture : futures) {
if (Objects.isNull(completableFuture) || Objects.isNull(completableFuture.get())) {
continue;
}
List<TransferDecisionDetailVO> transferDecisionDetailVOList = completableFuture.get()
.getTransferDecisionDetailVOList();
for (TransferDecisionDetailVO vo : transferDecisionDetailVOList) {
TransferDecisionModel transferDecisionModel = TransferDecisionConverter
.getTransferDecisionModel(completableFuture.get(), vo);
model.add(transferDecisionModel);
}
}
;
3、总结
这种方法可以在循环调用dubbo接口,或者调用外部http接口的时候,发挥巨大的优势,从而提高接口的效率。