完了ステージの依存関係をチェーンすることでモデル化しています。A
2 つのアクションおよびB
を別のアクションにチェーンする場合、関係およびC
を定義しますが、 と の間には関係がないため、順序関係を含め、それらの間に関係はありません。他の後に実行します。A → C
B → C
A
B
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAccept(s -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
});
次のようなものを印刷する可能性が非常に高い
entered first consumer in Thread[ForkJoinPool.commonPool-worker-1,5,main]
entered second consumer in Thread[main,5,main]
leaving second consumer
leaving first consumer
もちろん、それについての保証はありません。
2 つのコンシューマー間の依存関係を強制するには、それらを適切に連鎖させる必要があります。
CompletableFuture<String> base=CompletableFuture.supplyAsync(() -> {
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
return "source";
});
CompletableFuture<Void> next = base.thenAccept(s -> {
System.out.println("entered first consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving first consumer");
});
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(2));
base.thenAcceptBoth(next, (s,ignored) -> {
System.out.println("entered second consumer in "+Thread.currentThread());
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
System.out.println("leaving second consumer");
}).join();
ここで、2 番目のコンシューマーは と にチェーンされbase
、next
から結果を受け取りますが、の完了base
に依存しnext
ます (渡す結果がない場合は、通常は必要ありません。そのような場合は、設計を再考する必要があるかもしれません)。シナリオ)。
または、最初の値を値を通過する に変換することもできます。そのため、 を介してチェーンしてConsumer
、別のステージをチェーンできるようにすることができます。Function
thenApply
thenAccept