如何异步执行两个方法取结果传入第三方法处理后返回(基于CompletableFuture)
基于CompletableFuture的实现方案
你可以参考如下代码实现需求,两个查询方法异步并行执行,全部完成后合并结果封装返回:
import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; public class AsyncDemo { // 模拟你的第一个查询方法 private List<A> getFirstResults() { // 此处为你的原有业务逻辑,模拟耗时 try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException("获取第一批数据失败", e); } return new ArrayList<>(); } // 模拟你的第二个查询方法 private List<A> getSecondResults() { // 此处为你的原有业务逻辑,模拟耗时 try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException("获取第二批数据失败", e); } return new ArrayList<>(); } public B getResults() { // 1. 异步启动两个查询任务 CompletableFuture<List<A>> firstFuture = CompletableFuture.supplyAsync(this::getFirstResults); CompletableFuture<List<A>> secondFuture = CompletableFuture.supplyAsync(this::getSecondResults); // 2. 等待两个任务全部执行完成 CompletableFuture<Void> allTaskDone = CompletableFuture.allOf(firstFuture, secondFuture); // 3. 合并结果封装返回 return allTaskDone.thenApply(unused -> { List<A> mergedList = new ArrayList<>(); mergedList.addAll(firstFuture.join()); mergedList.addAll(secondFuture.join()); B finalResult = new B(); finalResult.setResults(mergedList); return finalResult; }).join(); } // 示例业务类 static class A {} static class B { private List<A> results; public void setResults(List<A> results) { this.results = results; } public List<A> getResults() { return results; } } }
注意事项
- 如果你不需要
getResults同步返回B对象,可以去掉最后的.join(),直接返回CompletableFuture<B>,让调用方自行决定什么时候获取结果,避免阻塞当前线程。 - 生产环境使用建议传入自定义线程池作为
supplyAsync的第二个参数,避免共用ForkJoin公共线程池出现资源争抢问题,示例:CompletableFuture.supplyAsync(this::getFirstResults, yourCustomThreadPool)。 join()方法会抛出未检查异常,如果需要处理单个任务的异常场景,可以在supplyAsync后追加exceptionally()方法做降级处理,避免单个任务失败导致整个流程报错。- 注意你示例代码里的
getSecondResulst存在拼写错误,实际使用时请替换为你自己的正确方法名。
内容的提问来源于stack exchange,提问作者Nico Sandros
相关产品推荐
相关产品推荐

