1. ホーム
  2. java

[解決済み] Executors.newCachedThreadPool() と Executors.newFixedThreadPool() の比較。

2022-04-15 18:04:28

質問

newCachedThreadPool() newFixedThreadPool()

どのような場合にどちらかを使うべきですか?リソースの活用という点では、どちらの戦略が優れているのでしょうか?

どのように解決するのですか?

この2つの関数の違いと使い方は、ドキュメントによく書かれていると思います。

newFixedThreadPool

を再利用するスレッドプールを作成します。 固定数のスレッドが 共有の非束縛キューを使用します。どの 最大でnThreadsのスレッドが存在することになります。 タスクを処理するアクティブな状態である。もし のときに追加タスクが投入された場合 は、すべてのスレッドがアクティブになると、そのスレッドは をキューに入れる。 を使用することができます。いずれかのスレッドが終了した場合 実行中の不具合による シャットダウンする前に、新しいものが引き継がれます。 を実行するために必要であれば、その代わりに 後続のタスク のスレッドは プールは、明示的に をシャットダウンします。

newCachedThreadPool

新しいスレッドを作成するスレッドプールを作成します。 スレッドを再利用します。 以前構築されたスレッドが が利用可能である。これらのプールは 通常、次のような場合にパフォーマンスが向上します。 短命のプログラムを多数実行するような 非同期タスク を呼び出すと は、以前に構築された スレッドがあれば、それを使用する。もし、既存の スレッドが利用できない場合、新しいスレッドが作成されます。 作成され、プールに追加される。 この間、使用されなかったスレッドは 60秒後に終了し はキャッシュから削除される。このように、プール を使用することで、十分な時間アイドル状態を維持することができます。 は、リソースを消費しない。ただし 似たようなプロパティを持つプールでも 詳細が異なる(例えば。 タイムアウトパラメータ) を作成することができます。 ThreadPoolExecutor コンストラクタを使用します。

リソースの面では newFixedThreadPool は、すべてのスレッドを明示的に終了させるまで稼働させ続けます。また newCachedThreadPool 60秒間使用されなかったスレッドは終了され、キャッシュから削除されます。

このように考えると、リソースの消費量は状況に大きく依存することになります。例えば、膨大な数の長時間稼働するタスクがある場合、私は FixedThreadPool . また CachedThreadPool ドキュメントには、「これらのプールは、通常、短時間の非同期タスクを多数実行するプログラムのパフォーマンスを向上させます」と書かれています。