スレッドプールの7つのコアパラメータ
1.corePoolSize(コアスレッドの数)
2.maxPoolSize(スレッドの最大数)
3.keepAliveTime(アイドル回復時間)
4.unit(回復時間単位)
5.workQueue(タスクキュー)
6.threadFactory(スレッドファクトリ、スレッドの作成に使用され、通常はデフォルトのスレッドファクトリ)
7.ハンドラー(拒否戦略)
execute(()メソッドを呼び出してリクエストタスクを追加すると、スレッドプールは次の判断を下します::
スレッド作成タスクの数がコアスレッドの数より少ない場合はcorePoolSizeが直接作成されて実行され、スレッド作成タスクの数がコアスレッドの数よりも多い場合はタスクキューworkQueueに追加されます。
(一般的なタスクキューには制限付きキューがあります: 1.ArrayBlockingQueue、2.SynchronousQueue、
無制限キュー:1。LinkedBlockingQueue、まだ詳細はありません。)待つ、
タスクキューもいっぱいの場合は、スレッドの最大数maxPoolSizeより大きいかどうかを確認します。キューがいっぱいで、実行中のスレッドの数がnaximumPoolSize未満の場合でも、非コアスレッドを作成する必要があります。タスクをすぐに実行するには、スレッドの最大数よりも多い場合は、拒否ポリシーハンドラーを実行します
(4つの拒否戦略があります:
1. CallerRunsPolicy:このストラテジーは、現在のタスクの追加を再試行し、成功するまでexecute()メソッドを繰り返し自動的に呼び出します。
2. AbortPolicy:拒否されたタスクを破棄し、例外をスローします。
3. DiscardPolicy:異常な情報なしに、拒否されたタスクを直接サイレントに破棄します。
4. DiscardOldestPolicy:拒否されたタスクを破棄せずに、キューで最も長く待機していたスレッドを破棄してから、拒否されたタスクをキューに追加します。
)そうでない場合は、作成して実行します。スレッドがタスクを完了すると、キューから次のタスクを取得して実行します。スレッドが特定の時間(keepAliveTime))を超えて何の関係もない場合、スレッドプールは判断します。現在実行中のスレッドの数がcorePoolSizeより大きい場合、このスレッドは停止します。したがって、スレッドプールのすべてのタスクが完了すると、最終的にはcorePoolSizeのサイズに縮小されます。