いくつかの処理を並列または非同期で実行するには、ExecutorService:<T> Future<T> submit(Runnable task, T result);
またはCompletableFuture Api:static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
のいずれかを使用できます(どちらの場合も同じExecutorを使用すると仮定します)
戻り型Future
とCompletableFuture
に加えて、顕著な違いがあります。または何を使用するのですか?
CompletableFuture
APIをデフォルトのExecutor
(executorのないメソッド)で使用した場合の違いは何ですか?
戻り値タイプFutureとCompletableFutureのほかに、顕著な違いがあります。または何を使用するのですか?
本当に簡単です。実行中のスレッドに非同期計算の応答を待機させる場合は、Future
を使用します。この例は、並列マージ/ソートを使用する場合です。非同期で左に並べ替え、同期して右に並べ替え、左で完了するのを待って(future.get()
)、結果をマージします。
実行されたスレッドとは非同期に、完了後の結果で何らかのアクションを実行する場合は、CompleteableFuture
を使用します。たとえば、非同期的に計算を行い、計算するときに、結果をシステムに書き込みます。要求側のスレッドは、結果を待つ必要がない場合があります。
単一のFuture実行可能ファイルで上記の例を模倣できますが、CompletableFuture
は、エラー処理が向上した、より流moreなインターフェイスを提供します。
本当に何をしたいかに依存します。
CompletableFutureApiをデフォルトのExecutor(executorを使用しない方法)で使用した場合の違いは何ですか?
システムのCPU数のデフォルトサイズであるForkJoin.commonPool()
に委任されます。 IO集中的な(ファイルシステムの読み取りおよび書き込み)を行う場合)スレッドプールを異なる方法で定義する必要があります。
CPUを集中的に使用する場合、commonPoolを使用するのが最も理にかなっています。
CompletableFutureには、複数のフューチャのチェーン、フューチャの結合、フューチャが実行された後のアクションの実行(同期および非同期の両方)などの豊富な機能があります。
ただし、CompletableFutureはパフォーマンスの点でFutureと違いはありません。 CompletableFutureの複数のインスタンスを(最後に.thenCombineと.joinを使用して)組み合わせた場合でも、.getメソッドを呼び出さない限り、それらのいずれも実行されず、この間、呼び出しスレッドはブロックされます。パフォーマンスに関しては、これはFutureよりも優れているとは思いません。
ここでパフォーマンスの一部が欠落している場合はお知らせください。
これにより、futureとcompletablefutureの違いがもう少し明確になりました。 FutureとPromiseの違い
CompletableFutureは約束のようなものです。