You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何异步执行两个方法取结果传入第三方法处理后返回(基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:24:04