web-dev-qa-db-ja.com

ExecutorService.submit(Task)vs CompletableFuture.supplyAsync(Task、Executor)

いくつかの処理を並列または非同期で実行するには、ExecutorService:<T> Future<T> submit(Runnable task, T result);またはCompletableFuture Api:static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);のいずれかを使用できます(どちらの場合も同じExecutorを使用すると仮定します)

戻り型FutureCompletableFutureに加えて、顕著な違いがあります。または何を使用するのですか?

CompletableFuture AP​​IをデフォルトのExecutor(executorのないメソッド)で使用した場合の違いは何ですか?

29
dermoritz

戻り値タイプFutureとCompletableFutureのほかに、顕著な違いがあります。または何を使用するのですか?

本当に簡単です。実行中のスレッドに非同期計算の応答を待機させる場合は、Futureを使用します。この例は、並列マージ/ソートを使用する場合です。非同期で左に並べ替え、同期して右に並べ替え、左で完了するのを待って(future.get())、結果をマージします。

実行されたスレッドとは非同期に、完了後の結果で何らかのアクションを実行する場合は、CompleteableFutureを使用します。たとえば、非同期的に計算を行い、計算するときに、結果をシステムに書き込みます。要求側のスレッドは、結果を待つ必要がない場合があります。

単一のFuture実行可能ファイルで上記の例を模倣できますが、CompletableFutureは、エラー処理が向上した、より流moreなインターフェイスを提供します。

本当に何をしたいかに依存します。

CompletableFutureApiをデフォルトのExecutor(executorを使用しない方法)で使用した場合の違いは何ですか?

システムのCPU数のデフォルトサイズであるForkJoin.commonPool()に委任されます。 IO集中的な(ファイルシステムの読み取りおよび書き込み)を行う場合)スレッドプールを異なる方法で定義する必要があります。

CPUを集中的に使用する場合、commonPoolを使用するのが最も理にかなっています。

20
John Vint

CompletableFutureには、複数のフューチャのチェーン、フューチャの結合、フューチャが実行された後のアクションの実行(同期および非同期の両方)などの豊富な機能があります。

ただし、CompletableFutureはパフォーマンスの点でFutureと違いはありません。 CompletableFutureの複数のインスタンスを(最後に.thenCombineと.joinを使用して)組み合わせた場合でも、.getメソッドを呼び出さない限り、それらのいずれも実行されず、この間、呼び出しスレッドはブロックされます。パフォーマンスに関しては、これはFutureよりも優れているとは思いません。

ここでパフォーマンスの一部が欠落している場合はお知らせください。

1
Chinmay Phadke

これにより、futureとcompletablefutureの違いがもう少し明確になりました。 FutureとPromiseの違い

CompletableFutureは約束のようなものです。

0
dermoritz