4

我有一个可完成的未来(future1),它创建了 10 个可完成的期货(futureN)。有没有办法将 future1 设置为仅当所有 futureN 都完成时才完成?

4

2 回答 2

6

我不确定“未来创造其他未来”是什么意思,但如果你有很多未来,并且你想在它们完成后做某事,你可以这样做: CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));

于 2015-12-11T17:36:14.383 回答
2

ACompletableFuture不是起作用的东西,所以我不确定你的意思

它创建了 10 个可完成的期货

我假设您的意思是您使用runAsyncor提交了任务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 回答