10 個の完了可能な先物 (futureN) を作成する完了可能な先物 (future1) があります。すべての futureN が完了した場合にのみ、future1 を完了として設定する方法はありますか?
2 に答える
「未来が他の未来を生み出す」とはどういう意味かわかりませんが、多くの先物があり、それらが完成したときに何かをしたい場合は、次のようにすることができます。
CompletableFuture.allOf(future2, future3, ..., futureN).thenRun(() -> future1.complete(value));
Aは作用するCompletableFuture
ものではないので、あなたが何を意味するのかわかりません
10個の完成可能な未来を作成します
runAsync
またはでタスクを送信したという意味だと思いますsubmitAsync
。私の例はそうではありませんが、そうしても動作は同じです。
root を作成しますCompletableFuture
。次に、Future を作成するコードを非同期的に実行します ( 、Executor
、runAsync
new 内、または戻り値Thread
とインラインで)。10 個のオブジェクトをCompletableFuture
収集し、それらがすべて完了すると完了する (例外的またはその他の場合)を取得するために使用します。次に、継続を追加して、ルートの未来を完成させることができます。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();
}