[2020年3月24日] Javaのインタビューの質問スレッドプールの詳細な7つの引数

 / ** 
     *新しい{作成@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

この方針のもと、キューにこのタスクを拒否しようとした後、最初のタスクを入力するようにキューを放棄しました

おすすめ

転載: www.cnblogs.com/july-sunny/p/12560533.html