4

10 個の完了可能な先物 (futureN) を作成する完了可能な先物 (future1) があります。すべての futureN が完了した場合にのみ、future1 を完了として設定する方法はありますか?

4

2 に答える 2

6

「未来が他の未来を生み出す」とはどういう意味かわかりませんが、多くの先物があり、それらが完成したときに何かをしたい場合は、次のようにすることができます。 CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));

于 2015-12-11T17:36:14.383 に答える
2

Aは作用するCompletableFutureものではないので、あなたが何を意味するのかわかりません

10個の完成可能な未来を作成します

runAsyncまたはでタスクを送信したという意味だと思いますsubmitAsync。私の例はそうではありませんが、そうしても動作は同じです。

root を作成しますCompletableFuture。次に、Future を作成するコードを非同期的に実行します ( 、ExecutorrunAsyncnew 内、または戻り値Threadとインラインで)。10 個のオブジェクトをCompletableFuture収集し、それらがすべて完了すると完了する (例外的またはその他の場合)を取得するために使用します。次に、継続を追加して、ルートの未来を完成させることができます。CompletableFutureCompletableFuture#allOfCompletableFuturethenRun

例えば

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 に答える