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