以下は、Java インタビューで私がまとめたスレッド プールに関する一般的な質問の一部です。ここで共有します。
(学習ビデオ共有: Java 教育ビデオ )
スレッド プールとは何ですか?
スレッド プールはマルチスレッド処理の一種で、処理中にタスクがスレッド プールに投入され、タスクの実行がスレッド プールによって管理されます。
リクエストごとに処理するスレッドが作成されると、サーバーのリソースはすぐに使い果たされてしまいます。スレッド プールを使用すると、作成および破棄されるスレッドの数を減らすことができ、各ワーカー スレッドを再利用できます。複数のタスクを実行できます。 。
スレッド プールを使用する理由
スレッドの作成と破棄のコストは比較的大きく、これらの時間は業務の処理時間よりも長くなる可能性があります。このような頻繁なスレッドの作成と破棄は、ビジネス ワーカー スレッドと相まってシステム リソース時間を消費し、システム リソースの不足につながる可能性があります。 (スレッドの作成と破棄のプロセスを削除できます)
スレッド プールの役割は何ですか?
スレッド プールの機能は、システム内の実行スレッドの数を制限することです。
1. 効率を向上します。一定数のスレッドを作成してプールに入れ、必要に応じてプールから 1 つ取り出します。これは、必要に応じてスレッド オブジェクトを作成するよりもはるかに高速です。
2. 管理を容易にするために、スレッド プール管理コードを記述して、プール内のスレッドを均一に管理できます。たとえば、プログラムは開始時に 100 個のスレッドを作成します。リクエストがあるたびに、スレッドが作成されます。同時リクエストが 101 件あった場合、無限のスレッド作成によるシステム クラッシュを避けるために、余分なリクエストをキューに入れることができます。
いくつかの一般的なスレッド プールと使用シナリオについて話しましょう
1. newSingleThreadExecutor
唯一の作業スレッドのみを使用するシングルスレッド スレッド プールを作成します。すべてのタスクが指定された順序 (FIFO、LIFO、優先順位) で実行されるようにします。
2. newFixedThreadPool
同時スレッドの最大数を制御できる固定長のスレッド プールを作成し、超過したスレッドはキューで待機します。
3. newCachedThreadPool
キャッシュ可能なスレッド プールを作成します。スレッド プールの長さが処理の必要性を超えた場合は、アイドル状態のスレッドを柔軟にリサイクルできます。リサイクルできない場合は、新しいスレッドを作成します。
4. newScheduledThreadPool
スケジュールされた定期的なタスクの実行をサポートするために、固定長のスレッド プールを作成します。
スレッド プール内のいくつかの重要なパラメータ
corePoolSize は、スレッド プール内のコア スレッドの数です。これらのコア スレッドは、役に立たなくなった場合にのみリサイクルされません
maximumPoolSize は、スレッド プールに収容できるスレッドの最大数です。
keepAliveTime は、コア スレッド以外の他のスレッドをスレッド プールに保持できる最長時間です。コアスレッドはタスクがなくてもクリアできません。残りのスレッドには生存時間があります。これは、非コアスレッドが保持できる最長のアイドル時間を意味します。
util を使用して、この時間を 1 単位として計算します。
workQueue は待機キューです。実行を待つタスク キューにタスクを格納できます。FIFIO 原則 (先入れ先出し) が実装されています。
(その他の関連するインタビューの質問の共有: java インタビューの質問と回答)
threadFactory は、スレッドを作成するスレッド ファクトリです。
handler は拒否戦略であり、タスクがいっぱいになった後で特定のタスクの実行を拒否できます。
スレッド プールの拒否戦略について話す
リクエスト タスクが引き続き到着し、現時点でシステムがそれらを処理できない場合、採用する必要がある戦略はサービスを拒否することです。 RejectedExecutionHandler インターフェイスは、タスク処理を拒否するカスタム メソッドの機会を提供します。 ThreadPoolExecutor には 4 つの処理戦略が含まれています。
AbortPolicy 戦略: この戦略は例外を直接スローし、システムが正常に動作しなくなります。
CallerRunsPolicy 戦略: スレッド プールが閉じられていない限り、この戦略は現在破棄されたタスクを呼び出し側スレッドで直接実行します。
DiscardOleddestPolicy 戦略: この戦略は、実行されようとしているタスクである最も古いリクエストを破棄し、現在のタスクを再度送信しようとします。
DiscardPolicy 戦略: この戦略は、何も処理せずに処理できないタスクをサイレントに破棄します。
JDK がデフォルトで提供する 4 つの拒否戦略に加えて、独自のビジネス ニーズに応じて拒否戦略をカスタマイズできます。カスタマイズ方法は非常に簡単で、RejectedExecutionHandler インターフェイスを直接実装するだけです。
実行と送信の違いは何ですか?
これまでの説明では、executeメソッドを使用してタスクを実行しましたが、executeメソッド以外にも、サブミットしたタスクを実行できるsubmitメソッドもあります。
これら 2 つの方法の違いは何ですか?どのようなシナリオに適用できますか?簡単な分析をしてみましょう。
execute は、戻り値に注意を払う必要がないシナリオに適しており、実行のためにスレッドをスレッド プールにスローするだけで済みます。
submit メソッドは、戻り値に注意する必要があるシナリオに適しています
5 つのスレッド プールの使用シナリオ
newSingleThreadExecutor: 順次実行を保証する必要があり、1 つのスレッドのみが実行されるシナリオで使用できるシングルスレッド スレッド プール。
newFixedThreadPool: 既知の同時実行圧力の下でスレッドの数を制限するために使用できる固定サイズのスレッド プール。
newCachedThreadPool: 無限に拡張できるスレッド プール。比較的実行時間の短いタスクの処理に適しています。
newScheduledThreadPool: 遅延してスケジュールして開始できるスレッド プール。定期的なタスクを実行するために複数のバックグラウンド スレッドが必要なシナリオに適しています。
newWorkStealingPool: 複数のタスク キューを持つスレッド プール。接続数を減らし、並列実行に使用可能な現在の CPU 数でスレッドを作成できます。
スレッド プールを閉じる
スレッド プールを閉じるには、shutdownNow および shutdown メソッドを呼び出します。
shutdownNow: 実行中のすべてのタスクに中断() を発行し、実行を停止し、キャンセルします。まだ開始されていないすべてのタスクを返し、まだ開始されていないタスクのリストを返します。
shutdown: shutdown を呼び出すと、スレッド プールは新しいタスクを受け入れなくなりますが、送信されたタスクや実行中のタスクを強制的に終了することはありません。
スレッド プールの初期化時のスレッド数の選択
タスクが IO 集中型の場合、通常、スレッド数を CPU 数の 2 倍以上に設定する必要があります。 CPU リソースの使用を最大化します。
タスクが CPU を集中的に使用する場合、通常、スレッド数は CPU の数に 1 を加えて設定するだけで済みます。スレッドを増やすと、コンテキストの切り替えが増加するだけで、CPU 使用率は増加しません。
上記は単なる基本的な考え方であり、本当に正確な制御が必要な場合は、オンラインになった後もスレッド プール内のスレッドとキューの数を観察する必要があります。
スレッド プールにはどのような種類のワーク キューがありますか?
1. ArrayBlockingQueue
は、配列構造に基づく制限付きブロッキング キューです。このキューは FIFO に基づいています。 (先入れ先出し) 要素を並べ替える原則。
2. LinkedBlockingQueue
リンク リスト構造に基づくブロッキング キューこのキューは、FIFO (先入れ先出し) に従って要素を並べ替え、通常、スループットは ArrayBlockingQueue よりも高くなります。静的ファクトリ メソッド Executors.newFixedThreadPool() は、要素を格納しないブロック キューであるこのキュー
#3、SynchronousQueue を使用します。各挿入操作は、別のスレッドが削除操作を呼び出すまで待機する必要があります。そうでない場合、挿入操作は常にブロックされ、スループットは通常 LinkedBlockingQueue よりも高くなります。静的ファクトリ メソッド Executors.newCachedThreadPool はこのキューを使用します。 4. PriorityBlockingQueue優先度のある無限ブロッキング キュー。 関連コースの推奨事項:以上がJava インタビュー スレッド プールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。