如何实现CompletableFuture异步调用,合并结果

460 阅读1分钟

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接口的时候,发挥巨大的优势,从而提高接口的效率。