我有一个可完成的未来(future1),它创建了 10 个可完成的期货(futureN)。有没有办法将 future1 设置为仅当所有 futureN 都完成时才完成?
问问题
3244 次
2 回答
6
我不确定“未来创造其他未来”是什么意思,但如果你有很多未来,并且你想在它们完成后做某事,你可以这样做:
CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));
于 2015-12-11T17:36:14.383 回答
2
ACompletableFuture
不是起作用的东西,所以我不确定你的意思
它创建了 10 个可完成的期货
我假设您的意思是您使用runAsync
or提交了任务submitAsync
。我的例子不会,但如果你这样做,行为是一样的。
创建你的根CompletableFuture
。然后异步运行一些代码来创建你的未来(通过一个Executor
, runAsync
, 在一个 newThread
内,或者与CompletableFuture
返回值内联)。收集 10 个CompletableFuture
对象并用于CompletableFuture#allOf
获得一个CompletableFuture
将在它们全部完成时完成的对象(例外或其他情况)。然后,您可以向其添加延续以thenRun
完成您的根未来。
例如
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();
}
于 2015-12-11T18:57:20.040 回答