Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 使用compose创建CompletableFutures的链接列表_Java_Asynchronous_Completable Future - Fatal编程技术网

Java 使用compose创建CompletableFutures的链接列表

Java 使用compose创建CompletableFutures的链接列表,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,我想创建一个完整的未来链 我正试图建立如下的东西 任务1执行某些操作并返回一个字符串作为结果当任务1完成时,我想以任务1的结果作为输入启动任务2。任务2准备好后返回一个整数,以此类推 所以它应该是非常动态的,所以我已经有了这个: try { CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1()); Completab

我想创建一个完整的未来链

我正试图建立如下的东西

任务1执行某些操作并返回一个字符串作为结果当任务1完成时,我想以任务1的结果作为输入启动任务2。任务2准备好后返回一个整数,以此类推

所以它应该是非常动态的,所以我已经有了这个:

      try {
            CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
            CompletableFuture<String> result = task1Future.thenCompose(task1Result -> CompletableFuture.supplyAsync(new Task2(task1Result)));
            System.out.println(result.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }


        public class Task1 implements Supplier<String> {

    public Task1() {
        System.out.println("Task 1 started");
    }

    @Override
    public String get() {
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Result Task 1";
    }
}
但我现在陷入了困境,因为我不知道如何进行链接,如何使任务更通用,从而可以使用前一个任务的结果启动它

所以我需要有一个方法来构建完整的未来,只需要说start(),一切都会发生


有人能帮我吗?

您应该将Task2定义为一个函数,因为它接受以前的字符串结果并生成新的整数结果:

public static class Task2 implements Function<String, Integer> {

    public Task2() {
        System.out.println("Task 2 started");
    }

    @Override
    public Integer apply(String s) {
        return s.length();
    }
}
公共静态类Task2实现函数{
公共任务2(){
System.out.println(“任务2已启动”);
}
@凌驾
公共整数应用(字符串s){
返回s.length();
}
}
然后您可以按如下方式链接它们:

   CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
   CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
   System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
    .thenApply(new Task1());
CompletableFuture task1Future=CompletableFuture.supplyAsync(newtask1());
CompletableFuture结果=Task1未来。然后应用(新Task2());
System.out.println(result.get());

您应该将Task2定义为一个函数,因为它接受以前的字符串结果并生成新的整数结果:

public static class Task2 implements Function<String, Integer> {

    public Task2() {
        System.out.println("Task 2 started");
    }

    @Override
    public Integer apply(String s) {
        return s.length();
    }
}
公共静态类Task2实现函数{
公共任务2(){
System.out.println(“任务2已启动”);
}
@凌驾
公共整数应用(字符串s){
返回s.length();
}
}
然后您可以按如下方式链接它们:

   CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
   CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
   System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
    .thenApply(new Task1());
CompletableFuture task1Future=CompletableFuture.supplyAsync(newtask1());
CompletableFuture结果=Task1未来。然后应用(新Task2());
System.out.println(result.get());

如果您希望所有任务都实现功能,您可以按如下方式启动链:

   CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
   CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
   System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
    .thenApply(new Task1());

如果您希望所有任务都实现功能,可以按如下方式启动链:

   CompletableFuture<String> task1Future = CompletableFuture.supplyAsync(new Task1());
   CompletableFuture<Integer> result = task1Future.thenApply(new Task2());
   System.out.println(result.get());
CompletableFuture<String> task1Future = CompletableFuture.completedFuture("S")
    .thenApply(new Task1());

为什么要在
CompletableFuture
已经提供的基础上创建另一个抽象呢?请记住
thenApply
仍然在同一个线程中工作。因此,如果
B
依赖于
A
,那么不要做任何复杂的事情。只需使用
然后应用
而不是
然后编写
等等,我不理解你的意思,你是说应用更好,因为它是同一个线程,而编写不是?为什么你要在
Completable Future
已经提供的基础上创建另一个抽象?请记住
然后应用
仍然在同一条线。因此,如果
B
依赖于
A
,那么不要做任何复杂的事情。只需使用
然后应用
而不是
然后编写
等等,我不理解你的意思,你的意思是应用更好,因为它是同一个线程,而编写不是?没有真正回答他的问题。他想用compose@ChristianBongiorno不,他想要一个简单的功能链:“当任务1完成时,我想用任务1的结果作为输入启动任务2。”。尝试使用撰写是一个错误。谢谢,这实际上是我正在寻找的。唯一的问题是,第一个仍然需要实现Supplier,因为它不能用SupplySync启动Task2之类的东西,而不是真正回答他的问题。他想用compose@ChristianBongiorno不,他想要一个简单的功能链:“当任务1完成时,我想用任务1的结果作为输入启动任务2。”。尝试使用撰写是一个错误。谢谢,这实际上是我正在寻找的。唯一的问题是,第一个仍然需要实现Supplier,因为它无法使用SupplySync启动类似Task2的东西。