/ ** *新しい{作成@codeの所定の初期とThreadPoolExecutor} *パラメータ。 * * @param corePoolSizeスレッドの数も、プール内に保つために 、彼らはアイドル状態である場合でない限り{* @code allowCoreThreadTimeOut}集合である * @param maximumPoolSizeに可能にするスレッドの最大数 *プール * @param keepAliveTimeが場合スレッドの数はより大きい コア*、これは超過したアイドル状態のスレッドが最大時間です *終了する前に新しいタスクを待ちます。 *@paramの単位{時間の単位@code keepAliveTimeが}引数 * @param それらがされる前にタスクを保持するために使用するワークキューキュー *実行。このキューは、{開催します@code Runnableを} {から提出された*タスク@code 実行}方法を。 * @param threadFactory使用する工場エグゼとき *は、新しいスレッドを作成します * @param ハンドラを使用するハンドラは実行がブロックされたときに *スレッドの境界およびキューの容量に達しているので、 * @throwsをIllegalArgumentExceptionが次のいずれかが成立する場合:<BR> * { @code corePoolSize <0} <BR> * { @code keepAliveTimeが<0} <BR> * { @code maximumPoolSize <= 0} <BR> * { @code maximumPoolSize <corePoolSizeは} * @throws {場合NullPointerExceptionが@code ワークキュー} *または{ @code threadFactory}または{ @codeのハンドラ}がヌルである * / パブリック ThreadPoolExecutor(INT corePoolSize、 INTmaximumPoolSize、 長いkeepAliveTimeが、 TimeUnitでユニット、 BlockingQueueの <Runnableを> ワークキュー、 ThreadFactory threadFactory、 のRejectedExecutionHandlerハンドラ)
A、corePoolSizeコアスレッドプールスレッドサイズ
スレッドプールは、スレッド処理のアイドルが、彼らはallowCoreThreadTimeOutない限り、破壊されない場合でも、スレッドの最小数を維持します。corePoolSizeあり、ここでスレッドの最小数。
二、スレッドのmaximumPoolSizeスレッドプールの最大数
タスクは、スレッドプールに提出された後、作業キューがいっぱいの場合、新しいスレッドが作業キューに最初のキャッシュ(それは後で紹介します)を作成した後、ハンドルに作業キューのタスクから取られ、新しいスレッドに引き渡されますしかし、タスクは、単に作業キューに提出しました。スレッドプールは、オープンエンド、新しいスレッドを作成することができません、それは、スレッド数、maximunPoolSizeによって指定された数に最大制限があります。
三、keepAliveTimeがアイドル状態のスレッドの生存期間
スレッドがアイドル状態にあり、スレッドの現在の数がcorePoolSizeよりも大きい場合、指定された時間後に、アイドル状態のスレッドは、ここkeepAliveTimeがによって指定された時間セット、破壊されます
四、単位空間のスレッド生存時間単位
測定のkeepAliveTimeが単位
五、ワークキューの作業キュー
新しいタスクが提出された後、それが最初にこのキューに入るために働くだろう、とするとき、スケジューリング、キューからジョブを削除します。JDKは4作業キューを提供します。
①ArrayBlockingQueue
アレイベースの有界ブロッキングキューは、FIFO順にソート。新しいタスクが入って来た後、キューの末尾に配置されます、有界の配列は、資源の枯渇の問題を防ぐことができます。スレッドプール内のスレッドの数がcorePoolSizeに達し、その後、新しいタスクが入って来ている場合、それは、スケジュールされるのを待って、待ち行列の最後尾に作業になります。キューがすでにいっぱいになっている場合、スレッドの数がmaxPoolSizeに達した場合、その後、新しいスレッドを作成し、それが戦略を実行することを拒否します。
②LinkedBlockingQuene
FIFO順で、(実際には、Interger.MAXの最大容量)アンバウンド形式のブロッキングキューのリストに基づいて。スレッドプール内のスレッドの数がcorePoolSizeに達し、その後、新しいタスクがでそこに来ている、パラメータmaxPoolSize、そのキューの作業キューを使用して、キューに格納されていたであろう、とmaxPoolSizeまで新しいスレッドを作成していないとき、おおよその非有界ので、実際には、それは動作しません。
③SynchronousQuene
タスクがキャッシュキューをブロックしていない、生産者は、タスクは、このタスクうち消費されるまで待たなければなりません置きます。これは、新しいタスクがキャッシュされませんが、直接使用可能なスレッドが存在しない場合、スレッドの数がmaxPoolSizeに達した場合、戦略を実行することを拒否し、新しいスレッドを作成し、このタスクを実行するようにスケジュールされ、入って来ています。
④PriorityBlockingQueue
優先順位の無制限のブロッキングキューは、優先順位は、パラメータ比較によって達成されます。
六、threadFactoryスレッドファクトリ
新しいスレッドを作成し、使用する工場では、スレッドがどうかなどデーモンスレッドとして、名前を設定するために使用することができます
ポリシーを拒否ハンドラ七、
タスクキューの作業が上限に達している、とスレッドプール内のスレッドの数が上限に達した場合は、新しいジョブの投入がある場合は、それをどのように処理するか、で来ます。ここでは政策を否定する、それがこの問題を解決することで、4拒否戦略を提供するJDK:
①CallerRunsPolicy
スレッドプールは、直接タスクを放棄し、シャットダウンされていない限り、この方針のもと、runメソッドの実装では、呼び出し元のスレッドでタスクを直接拒否されます。
②AbortPolicy
この方針の下では、タスクとスローRejectedExecutionException例外を破棄します。
③DiscardPolicy
この方針の下、それは何もしない、タスクを破棄します。
④DiscardOldestPolicy
この方針のもと、キューにこのタスクを拒否しようとした後、最初のタスクを入力するようにキューを放棄しました