技術共有

スレッドプールの理解と 7 つのパラメータ

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

理解を定義する

スレッド プールは実際にはプーリング テクノロジの実装であり、プーリング テクノロジの中心的なアイデアは、リソースの再利用を実現し、リソースの作成と破棄の繰り返しによって生じるパフォーマンスのオーバーヘッドを回避することです。スレッド プールは、タスクの完了後にスレッドが破棄されずに、他のスレッドによって送信されたタスクの処理を継続できるように、多数のスレッドを管理できます。

スレッド プールを使用する利点

  • リソースの消費を削減します。作成されたスレッドを再利用することで、スレッドの作成と破棄のコストを削減します。
  • 応答速度を向上させます。タスクが到着すると、スレッドの作成を待たずにすぐにタスクを実行できます。
  • スレッドの管理性を向上させます。スレッドは希少なリソースです。制限なしで作成すると、システム リソースを消費するだけでなく、スレッド プールを統合割り当て、チューニング、監視に使用することもできます。

構築パラメータ

ここに画像の説明を挿入します

  • corePoolSize: スレッド プールでの作業に使用されますコアスレッドの数
  • 最大プールサイズ:最大スレッド数 、スレッド プールによって作成できるスレッドの最大数。スレッド プール内のスレッド数が corePoolSize に達したとき、タスク キューがいっぱいで新しいタスクを処理する必要がある場合、スレッド プールはこれらのタスクを処理するために新しいスレッドを作成します (ただし、合計数は maximumPoolSize を超えません)。 (これは、キュー領域がいっぱいの場合、後続のスレッドがキューに直接ジャンプできるのと同じです。) タスクの数がmaximumPoolSizeを超え、タスクキューがいっぱいの場合、スレッドプールは拒否ポリシーに従ってこれらの実行不可能なタスクを処理します。
  • keepAliveTime: corePoolSize を超えた後に作成されたスレッドまたはすべてのスレッドの生存時間最大生存時間、構成に応じて。
  • 単位:keepAliveTime 的時間単位
  • 作業キュー:タスクキューはブロッキング キューです。スレッド数がコア スレッドの数に達すると、タスクはブロッキング キューに格納されます。共通の実装: ArrayBlockingQueue、LinkedBlockingQueue などの BlockingQueue インターフェイスの実装クラス。
  • threadFactory: スレッド プール内にスレッドを作成するために使用されます。工場
  • ハンドラ:拒否ポリシー; キューがいっぱいでスレッド数が最大スレッド数に達すると、タスクを処理するためにこのメソッドが呼び出されます。

パラメータの設定方法

1. コアスレッドの数 (corePoolSize) を決定します。

  • CPU 集中型タスク: CPU 集中型タスクの場合、コア スレッドの数を CPU コア数の 1 ~ 2 倍に設定するのが一般的です。これにより、過剰なコンテキストの切り替えを回避しながら、CPU リソースを最大限に活用することが保証されます。
  • IO 集中型タスク: IO 集中型タスクの場合、IO 操作の待機中にスレッドが CPU を占有しないため、より多くのコア スレッドを設定できます。一般に、コア スレッドの数は CPU コアの数の 2 倍以上に設定できるため、IO を待機している間により多くのタスクを処理できます。
  • 混合タスク: アプリケーションに CPU 集中型タスクと IO 集中型タスクの両方が含まれている場合は、特定の状況に基づいてコア スレッド数の設定のバランスをとる必要があります。

2. スレッドの最大数 (maximumPoolSize) を決定します。

  • リソースに制約のある環境: リソースに制約のある環境 (組み込みシステムやクラウド サーバーなど) では、スレッドが多すぎてリソースを占有しないように、スレッドの最大数を制限する必要があります。
  • 高同時実行システム: 多数の同時リクエストを処理する必要があるシステムの場合、スレッドの最大数を適切に増やして、システムの同時処理能力を向上させることができます。ただし、最大スレッド数の設定は、システムの負荷容量やリソース状況を基に総合的に検討する必要があります。

3. スレッドのアイドル時間の設定 (keepAliveTime)

  • CPU を集中的に使用するアプリケーション: CPU を集中的に使用するアプリケーションの場合、CPU リソースは非常に貴重であり、アイドル状態のスレッドが多すぎてリソースを占有することが望ましくないため、通常はスレッドのアイドル時間をより短い値に設定できます。場合によっては、非コアスレッドが保持されないことを示す 0 に設定されることもあります。
  • IO 集中型アプリケーション: IO 集中型アプリケーションの場合、IO 操作を待機しているときにスレッドが CPU リソースを占有しないため、スレッドのアイドル時間をより長い値 (1 分以上など) に設定して、頻繁なスレッドの起動と破棄を回避できます。パフォーマンスのオーバーヘッドが発生します。

4. タスクキュー(workQueue)を選択します。

  • 有界キュー : 境界付きキューを使用すると、キュー内のタスクの待機時間を制限し、タスクが多すぎることによるメモリ オーバーフローを回避できます。ただし、キューの長さが小さすぎると、タスクが拒否される可能性があります。 (通常は有界キューを選択します
  • 無制限のキュー: 無制限のキューを使用すると、すべてのタスクを可能な限りキャッシュできますが、メモリ消費の問題に注意する必要があります。無制限のキューが使用される場合、スレッド プールはキュー内のタスクを処理するための新しいスレッドを作成しようとしないため、スレッド プールの最大スレッド数パラメータが無効になる可能性があります。

5. スレッドファクトリ(threadFactory)の設定

スレッド ファクトリは、新しいスレッドを作成するために使用されます。スレッド ファクトリをカスタマイズすると、スレッドの優先順位、デーモン スレッドのステータス、その他の属性を設定できます。また、JVM での問題診断を容易にするために、スレッドに意味のある名前を設定することもできます。

6. 拒否ポリシーの構成 (ハンドラー)

スレッド プールが新しいタスクを処理できない場合 (つまり、スレッド数が maximumPoolSize に達し、タスク キューがいっぱいである場合)、これらの実行不可能なタスクを処理するために拒否ポリシーを構成する必要があります。一般的な拒否戦略には次のものがあります。例外を直接スローする呼び出し元のスレッドを使用してタスクを実行する新しいタスクを無視し、キュー内の最も古いタスクを破棄します。待って。必要に応じて拒否ポリシーをカスタマイズすることもできます。