如何使用 CompletableFuture 将第一个 Callable 任务的结果用作所有后续 Callable 任务的参数?

How to use CompletableFuture to use result of first Callable task as arg to all subsequent Callable tasks?

如何使用 CompletableFuture 将第一个 Callable 任务的结果用作所有后续 Callable 任务的参数?我有 3 个任务需要 运行 像这样:

  1. 第一个阻塞任务 运行s 和 returns 一个值
  2. 第二和第三个任务 运行 与第一个任务提供的参数和 return 值不同步。
  3. 所有 3 个值加起来作为所有这些值的最终结果。

我试图在下面这样做,但我卡在 .thenApply 子句上。

我不太能使这段代码正常工作。在 .thenApply 子句中,如何传递来自对象响应的参数 returned?

import com.google.common.util.concurrent.Uninterruptibles;
import java.util.concurrent.*;
public class ThreadPoolTest {

    static ExecutorService threadPool = Executors.newFixedThreadPool(10);
    
    public static void main(String[] args) {
        CompletableFuture<SumCalculator> cf =
          CompletableFuture.supplyAsync(() -> new SumCalculator(100000), threadPool);
        Integer initialResult = cf.getNow(null).call();
        CompletableFuture<SumCalculator> cf2 = CompletableFuture.completedFuture(initialResult)
        .thenApplyAsync((i) -> new SumCalculator(i));
     //  i want to call 2 or more SumCalulator tasks here

        System.out.println("DONE? "  + cf2.isDone());
        System.out.println("message? " + cf2.getNow(null).call());
        threadPool.shutdown();
        System.out.println("Program exit.");
    }

    public static class SumCalculator implements Callable<Integer> {
        private int n;
        public SumCalculator(int n) {
            this.n = n;
        }
        public Integer call() {
            int sum = 0;
            for (int i = 1; i <= n; i++) {
                sum += i;
            }
            Uninterruptibles.sleepUninterruptibly(800, TimeUnit.MILLISECONDS);
            return sum;
        }
    }

}

注意:我确实想在 Futures 的末尾将所有 3 个任务的响应收集在一起作为一个组合结果列表,也许是作为一个整数值流?在这种情况下,我想对这些值求和。我想这样做是为了获得多线程的性能优势。

如果我理解正确的话:

    CompletableFuture<Integer> one =
            CompletableFuture.supplyAsync(() -> new SumCalculator(100000).call(), threadPool);

    CompletableFuture<Integer> two = one.thenApplyAsync(x -> new SumCalculator(x).call(), threadPool);
    CompletableFuture<Integer> three = one.thenApplyAsync(x -> new SumCalculator(x).call(), threadPool);

    Integer result = one.join() + two.join() + three.join();
    System.out.println(result);