当前位置: 首页 > 知识库问答 >
问题:

如何使用完全未来使用第一个可调用任务的结果作为参数,所有后续的可调用任务?

颛孙越
2023-03-14

如何使用完全未来使用第一个可调用任务的结果作为参数,所有后续的可调用任务?我有3个任务需要这样运行:

  1. 第一个阻塞任务运行并返回一个值

我试图在下面这样做,但我被困在上。然后应用子句。

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

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;
        }
    }

}

注意:我确实希望在未来结束时,将所有3个任务的响应作为一个组合结果列表收集在一起,或许作为一个整数值流?在这种情况下,我想求和这些值。我希望通过多线程来提高性能。

共有1个答案

夔高寒
2023-03-14

如果我理解正确:

    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);
 类似资料:
  • 1.)在预定义数据库2中运行liquibase变更集。)对数据库3运行多个测试。)回滚使用前一个变更集所做的所有更改 每次测试时,我都希望数据库处于“干净”状态。它应该只有我期望的变化,没有其他。liquibase使用Gradle插件进行设置,并应用/更新变更集。但是,我不想手动调用该命令。这将是需要在持续集成中运行的东西,所以我需要编写脚本,让配置项调用一个任务,然后按顺序运行每个任务,直到结束

  • 我用谷歌搜索了这个,但仍然无法得到一个坚实的理解。我找不到任何使用构造函数的特定示例 Java博士说 未来提交(可运行任务,T结果) 提交一个可运行任务以供执行,并返回一个表示该任务的未来。Future 的 get 方法将在成功完成后返回给定的结果。 看到这一点,我的理解是在任务完成后的未来任务。get(),它将返回传递的给定结果对象,该对象与“可运行”作业无关。这是一种“可运行”作业完成的信号。

  • 在类型中定义了不同数量的任务,因此可以定义任务,但不能自动启动。例如说: 以这种方式定义的一些任务返回值。我需要一种方法来‘传递’这些任务的结果到后续任务的参数,以同样的方式定义。所以,我想写: 任务按定义的顺序处理,每个任务在处理下一个任务之前完成。任务的结果仅用于后续任务。 在使用响应对可运行代码的请求时,如下所示。创建一个新的WPF项目,并将一个按钮添加到默认网格中。然后清除mainWind

  • 我在用Gradle。我有两个任务:“A”和“B”。我想让任务“A”调用任务“B”。我怎么能这么做? 是否可以简单地从现有任务中调用另一个任务?

  • 我正在尝试使用C#'s async/await/continuewith。我的目标是必须有两个并行运行的任务,尽管哪个任务是按顺序执行一系列操作。为了做到这一点,我计划有一个清单 为了总结,这里有一个示例来说明我期望发生的事情: 预期输出为 但是,输出是 有没有一种方法可以让调用的任务等待提供的函数完成后才被视为完成?即。.等待将等待两个任务都完成,一个是原始任务,另一个是ContinueAnd返

  • 我正在开始执行器服务,我想知道当任务完成时如何调用函数。我见过这个函数http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#isDone-- 但我不确定如何将其连接到我的代码中调用函数<code>endoftheroad() 这是我的代码