Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用CompletableFuture将第一个可调用任务的结果用作所有后续可调用任务的参数?_Java_Executorservice_Completable Future_Threadpoolexecutor - Fatal编程技术网

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

Java 如何使用CompletableFuture将第一个可调用任务的结果用作所有后续可调用任务的参数?,java,executorservice,completable-future,threadpoolexecutor,Java,Executorservice,Completable Future,Threadpoolexecutor,如何使用CompletableFuture将第一个可调用任务的结果用作所有后续可调用任务的参数?我有3项任务需要像这样运行: 第一个阻塞任务运行并返回一个值 第二个和第三个任务使用第一个任务提供的参数和返回值异步运行 所有3个值相加为所有值的最终结果 我试着在下面这样做,但是我被卡住了。然后应用子句 我无法让这个代码正常工作。在.thenApply子句中,如何从返回的对象响应传递参数 import com.google.common.util.concurrent.Uninterruptible

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

  • 第一个阻塞任务运行并返回一个值
  • 第二个和第三个任务使用第一个任务提供的参数和返回值异步运行
  • 所有3个值相加为所有值的最终结果
  • 我试着在下面这样做,但是我被
    卡住了。然后应用
    子句

    我无法让这个代码正常工作。在
    .thenApply
    子句中,如何从返回的对象响应传递参数

    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;
            }
        }
    
    }
    
    import com.google.common.util.concurrent.unterruptibles;
    导入java.util.concurrent.*;
    公共类线程池测试{
    静态ExecutorService线程池=Executors.newFixedThreadPool(10);
    公共静态void main(字符串[]args){
    完全未来=
    CompletableFuture.SupplySync(()->新的SumCalculator(100000),线程池);
    Integer initialResult=cf.getNow(null).call();
    CompletableFuture cf2=CompletableFuture.completedFuture(初始结果)
    .thenApplyAsync((i)->新的SumCalculator(i));
    //我想在这里调用2个或更多SumCalulator任务
    System.out.println(“完成?”+cf2.isDone());
    System.out.println(“消息?”+cf2.getNow(null.call());
    threadPool.shutdown();
    System.out.println(“程序退出”);
    }
    公共静态类SumCalculator实现了可调用{
    私人int n;
    公共计算器(int n){
    这个,n=n;
    }
    公共整数调用(){
    整数和=0;
    
    对于(int i=1;i如果我理解正确:

        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);
    
    CompletableFuture-one=
    CompletableFuture.SupplySync(()->新的SumCalculator(100000).call(),线程池);
    CompletableFuture two=1.thenApplyAsync(x->new Sumculator(x.call(),threadPool);
    CompletableFuture three=1.thenApplyAsync(x->new Sumculator(x.call(),threadPool);
    整数结果=1.join()+2.join()+3.join();
    系统输出打印项次(结果);
    
    执行此代码时,当前会发生什么情况?如果第一次计算必须在第二次和第三次计算继续之前完成,则不能同时启动它们。我不确定我是否理解您的要求。我正要写一个答案,然后您开始每隔几分钟对问题进行垃圾邮件编辑和更改。现在它甚至可以有很多不一致的地方。我想我已经完成了。我试图简化,因为另一个人说他们不理解这个问题。@djangofan是的,我知道。但是在一个(!)大编辑。你甚至可以删除和取消删除问题,并在两者之间进行编辑。或者更好:在点击帖子之前写一个好的、易懂的、没有矛盾的、清晰的问题。什么是
    CompletableFuture.allOf(一、二、三)
    for?加入的
    已经被阻止了。这似乎是我正在寻找的。让我试试…@akuzminykh我的错,编译起来有点奇怪(想想)手机上的代码;这确实不需要。看起来它对我有效。谢谢EugeneI我找到了答案:只是没有正确标记泛型类型。谢谢你的帮助!