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. 小さなタスクは任せる
ブロックキューがいっぱいです。どう対処すればよいですか?