2023 年のインタビュー シリーズでスレッド プールを使用しましたが、その基礎となる原則がわかりません。

1. スレッド プールを使用する理由:


1. スレッドの頻繁な作成と破棄によるパフォーマンスの消費を削減します。

2. スレッドの管理が簡単

3. 応答速度の向上(スレッドの作成を待つ必要がなくなりました)

4. より多くの機能を提供できる

2. スレッド プールの作成方法:


執行者によって作成されました

ThreadPoolExecutor によって作成されました (推奨)

3. スレッド プールのパラメータの説明:


コアプールサイズ

最大プールサイズ

キープアライブ時間

TimeUint 単位

BlockingQueue<Runnable> workQueue、

RejectedExecutionHandler ハンドラー

4. スレッド プール プロセス:


- タスクが存在する場合、現在のスレッド数がコア スレッド数より少ない場合は、コア スレッド数が最初に作成されてタスクが実行されます。

スレッド数がコア スレッド数に達すると、タスクはブロッキング キューに追加されます。ブロッキング キューがいっぱいで、現在のスレッド数がコア スレッドの数より大きく最大スレッド数より少ない場合は、実行用に非コア スレッドの数が作成されます。満足できない場合は、拒否ポリシーを実行します

スレッドプールのステータス:

実行中-ShowDown-ShowDownNow-停止-片付け-終了

5. 基礎となる原理を理解するためのスレッド プールのいくつかの重要な方法


-excute(実行可能なコマンド)
-addWorker(実行可能なfistTask、ブールコア)


まとめ:


--addWorker メソッドには 3 つの異なるパラメータ呼び出しがあり、タスクを追加する過程でスレッド プールの状態とスレッド数が複数回判定されます。

addWorker(first, true): コア スレッドの数よりも少ない、タスクを実行するコア スレッドを作成します

addWorker(null, false): スレッド数 < スレッドの最大数をブロッキング キューに追加します。

addWorker(first, false): ブロッキング キューがいっぱいです。タスクを実行するための新しい非コア スレッドを作成します。

-runWorker(ワーカー w)
-getTask()
-processWorkerExit(ワーカー w、boolean completedAbruptly)

6. スレッド プールの技術的なハイライト:


スレッド プールは CAS と AutomicInteger を使用してスレッド数とスレッド ステータスを変更します。コア パラメータは Volatile で変更されます。同時に、Condition と ReentrantLock を使用してスレッドの作成、スレッド プールのステータスの変更、スレッド数の変更が行われます。作業タスク (追加と削除) などの情報を取得して、allowCoreThreadTimeOut || wc > corePoolSize を通じてポーリングまたはテイク メソッドまたはタスクを使用するかどうかを決定します。ワーカーは AQS も継承します (非再入可能、スレッドは実行中に中断されません)。

7. スレッドプールを使用する場合の注意事項:


1. リソースの無駄を避けながらリソースを最大限に活用するために、コア スレッドとスレッドの最大数を適切に設定します。

2. 拒否戦略を選択し、スローされた例外の処理に注意を払います。

3. ブロッキング キューの不当な設定、LinkedBlockedQueue の使用によりスレッド プールのオーバーフローが発生する

4. 繰り返し作成されたスレッドプール、忘れずに対決

5. ビジネス ニーズに応じて、ブロックされたコア スレッドをリサイクルするには、allowCoreThreadTimeOut (true) を設定します。

8. シンプルなカスタム スレッド プール名: 異なるビジネスの下でスレッド プールを区別します。


9. シンプルなカスタム拒否ポリシー

10. 小さなタスクは任せる

ブロックキューがいっぱいです。どう対処すればよいですか?
 

おすすめ

転載: blog.csdn.net/weixin_42450130/article/details/132645241