Java 当另一组可完成的期货完成时,你如何完成一个可完成的期货?

Java 当另一组可完成的期货完成时,你如何完成一个可完成的期货?,java,lambda,java-8,completable-future,Java,Lambda,Java 8,Completable Future,我有一个完整的未来(future1),它创造了10个完整的未来(futureN)。只有当所有future1都完成时,才有办法将future1设置为完成吗 我不知道你所说的“未来创造其他未来”是什么意思,但如果你有很多未来,并且你想在它们完成后做些什么,你可以这样做: CompletableFuture.allOf(future2,future3,…,futureN)。然后运行(()->future1.complete(value))ACompletableFuture不是起作用的东西,所以我不确

我有一个完整的未来(future1),它创造了10个完整的未来(futureN)。只有当所有future1都完成时,才有办法将future1设置为完成吗

我不知道你所说的“未来创造其他未来”是什么意思,但如果你有很多未来,并且你想在它们完成后做些什么,你可以这样做:
CompletableFuture.allOf(future2,future3,…,futureN)。然后运行(()->future1.complete(value))

A
CompletableFuture
不是起作用的东西,所以我不确定你说的是什么意思

这创造了10个完整的未来

我假设您的意思是您提交了一个带有
runAsync
submitAsync
的任务。我的例子不会,但如果你这样做,行为是一样的

创建你的根。然后异步运行一些创建未来的代码(通过
执行器
,在新的
线程内
,或与
CompletableFuture
返回值内联)。收集10个
CompletableFuture
对象,并用于获取一个
CompletableFuture
,当它们全部完成时(异常或其他情况下),该对象将完成。然后,您可以使用添加一个延续来完成根未来

比如说

public static void main(String args[]) throws Exception {
    CompletableFuture<String> root = new CompletableFuture<>();

    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
        CompletableFuture<String> cf1 = CompletableFuture.completedFuture("first");
        CompletableFuture<String> cf2 = CompletableFuture.completedFuture("second");

        System.out.println("running");
        CompletableFuture.allOf(cf1, cf2).thenRun(() -> root.complete("some value"));
    });

    // once the internal 10 have completed (successfully)
    root.thenAccept(r -> {
        System.out.println(r); // "some value"
    });

    Thread.sleep(100);
    executor.shutdown();
}
publicstaticvoidmain(字符串args[])引发异常{
CompletableFuture根=新的CompletableFuture();
ExecutorService executor=Executors.newSingleThreadExecutor();
执行人提交(()->{
CompletableFuture cf1=CompletableFuture.completedFuture(“第一”);
CompletableFuture cf2=CompletableFuture.completedFuture(“第二”);
System.out.println(“运行”);
CompletableFuture.allOf(cf1,cf2)。然后运行(()->root.complete(“某个值”);
});
//一旦完成内部测试(成功)
根目录。然后接受(r->{
System.out.println(r);/“一些值”
});
睡眠(100);
executor.shutdown();
}

有任何与此问题相关的代码吗?如果
future1
提交其他期货,您不确定“完成”是什么意思,为什么不调用阻塞操作,它将阻塞
future1
,直到其他期货返回结果(完成)?