オリジナル住所:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0
この記事では、オリジナルの基盤+元のアドレスを見て、あなたは、システムが学びたいことを理解しています。
スレッドプール
1.1スレッドプールの概念
プール(スレッドプールを)スレッド:スレッドの使用パターンに。破壊のスレッドを作成することは非常にリソースの消費量(スレッドの作成のメモリ消費量、消費量からCPUリソースを切り替えるスレッドコンテキスト)です。スレッドプールは、より完全連携アプリケーションCPU、メモリ、ネットワーク、I / Oおよび他のシステムリソースすることができ使用してください。プログラムは、タスクが直接スレッドプールでこのタスクを実行するために、スレッドプールに投げ込ますることができます開始後のプログラムは、最初のスレッドを作成して開始します。
問題を解決するための1.2のスレッドプール
①スレッドの作成は、犯人は、仮想マシン・スタック、ネイティブメソッドスタックおよび技術的なプログラムや他のスレッドプライベートメモリを開きます破壊します。
②制御されない場合、スレッドコンテキストは専用通信を切り替えるので、それは、特定の値に達したスレッドの数は、CPUのリソースを引き起こし、極端な場合には、システムは、タイムスライスがコンテキストスイッチを実行するために使用される割り当てないが、それには時間実際のタスクを実行します。
③糸の頻繁な破壊を作成することは並行プログラミングのリスクを増大させます。
④スレッドプールは待機を解決したりするとき、あまりにも多くのスレッドフレンドリーなサービスをやってのけることができます。
1.3スレッドプールのアクション
①同時の最大数を制御し、スレッドプールスレッド管理多重化を使用します。(実際の作業が行われていない一方で、完全なコンテキストスイッチが生じ、あまり食べないでください)
②タスクキューのスレッドのキャッシュ戦略と拒否メカニズムを実現します。(処理スレッドあまりにもエレガントなケース)
③実際に関連付けられている特定の機能を実現します。(あなたは、スケジュールされたタスクを完了するために、スレッドプールを使用することができます)
④隔離スレッド環境。(スレッド・プールの異なるタイプのスレッドの相互作用を避け、異なるサービスを隔離、サーバーを置くことができます)
1.4スレッドプール少し
①頻繁にメモリの割り当てと破壊を回避するために、リソースの消費量を削減
②応答速度を向上させる、(スレッドプールアイドルスレッドものとする)に直接タスクを実行するスレッドの作成を完了する必要はありません
③スレッドの管理性を向上させ、スレッドプールは、監視とチューニングを割り当て、同じように管理することができます。
スレッドプールを作成します。
ThreadPoolExecutor工法からの最初のカスタムThreadFactoryとのRejectedExecutionHandlerは、単純なスレッドプールを書くために、懸念しています。実行のThreadPoolExecutorとaddWorker 2つのコアの方法による。
公共 ThreadPoolExecutor(INT corePoolSize、 INT maximumPoolSize、 長いkeepAliveTimeが、 TimeUnitでユニット、 BlockingQueueの <Runnableを> ワークキュー、 ThreadFactory threadFactory、 のRejectedExecutionHandlerハンドラ){ ... }
パラメータ:
①corePoolSize:コアスレッドを表します。
corePoolSize = 0、他のタスクは、スレッドプールのスレッド内に存在しないタスクを実行した後、新鮮な破壊します
corePoolSize> 0、地元のタスクが終了すると、スレッドプールのスレッドがcorePoolSizeままになります
②maximumPoolSizeは:最大実行スレッドを収容することができるプール内のスレッドの数を表します。
maximumPoolSize> = 1、プール内の実行スレッド、1以上の数であれば。
あなたが実行する必要がある場合は5番目のパラメータハンドラは、キャッシュまたは破棄を処理する必要がmaximumPoolSizeスレッド、スレッドの数よりも大きいです。
③keepAliveTime:スレッドプールのスレッドのアイドル時間を表し
アイドル時間が、keepAliveTimeがに達したときにスレッドの文字の数よりも多いスレッドプール内のスレッドの数は、スレッドが破壊されています。
このパラメータを使用して、リソースの浪費を避けることができます。
allowCoreThreadTimeOut = trueの場合は、コアスレッドタイムアウトが回収されます。
ソースから、allowCoreThreadTimeOutは揮発性によって変更され、プール内のスレッドの値の変化があることを言ってこれを説明する初期値がないので、見ることができ、デフォルト値は、コア、スレッドのタイムアウトを意味し、falseで回復されることはありません。
trueに設定されている場合には、スレッドは直ちに回収アイドル示しアイドル時間<= 0、であることを保証するために、プロセスによって設定することができます。
プライベート 揮発 ブールallowCoreThreadTimeOut。 公共 のボイド allowCoreThreadTimeOut(ブール値){ 場合(値&& keepAliveTimeが<= 0 ) スロー 新しい、IllegalArgumentExceptionを(「コアスレッドがゼロでない生きている時間を保つ持っている必要があります」); allowCoreThreadTimeOut = 値。 }
④unit:時間の1つの単位
通常keepAliveTimeが単位TimeUnit.SECONDS。
⑤workQueue:バッファキューを表し
要求されたスレッドの数は、同時実行スレッド数の最大値よりも大きい場合、スレッドはこのBlockingQueueの、閉塞性保証チームにチームの原子を入力します
⑥threadFactory:スレッドファクトリ
同じタスクにスレッドのグループを生成するために使用します。
スレッドプールを命名するグループ名接頭辞を高めるために、工場によって達成されます。
分析は、タスクスレッドファクトリ通された時点で知られているVMのスタック。
⑦handler:拒否した戦略を表すオブジェクト
スレッドが実行キューをブロックする最大値より大きくなるようにすると、要求がポリシー、シンプルな電流制限保護ポリシーモデルによって処理することができます。
エレガント拒否した戦略は、次のとおりです。
谷埋めを消費するためにデータベースを保存し、その後、アイドルの事で実行抽出
プロンプトページステアリング
印刷ログ
2.1.1 corePoolSizeカーネルスレッドの数。
このパラメータがfalseである場合を除き、スレッドプール内のスレッドの数は、新聞が、でもアイドルスレッドの間に、スレッドがスレッドプールに存在する必要があり、allowCoreThreadTimeOutを設定します。スレッドプール内のスレッドの数は、カーネルスレッドの数より少ない場合、スレッドプールは、新しいスレッドを作成する無料のスレッドプールのスレッドがある場合でも、このタスクを実行するために、新しいスレッドを作成します。スレッドプール内のスレッドの数がスレッドの信頼の数に等しいような、タスクがキューに配置され、スレッドを生成しないであろう。
)(駄々をこねるスレッドプールのprestartAllCoreThreads場合は、スレッドプールは、事前に作成され、すべてのコアスレッドを開始します。
公共 INT prestartAllCoreThreads(){ int型のn = 0 。 一方、(addIfUnderCorePoolSize(ヌル)) ++ N。 返すのn; }
スレッドの2.1.2 maximumPoolsizeスレッドプールの最大数同時に実行されるスレッド
スレッドプール内のスレッドの最大数は、の作成を可能に
キューがいっぱいの場合、および最大数(スレッドの固定数)スレッド未満に作成されたスレッドの数は、スレッドプールは、タスクを実行するための作品に新しいスレッドを再作成します。アンバウンド形式のキューは役に立たないパラメータ。cachedThreadPool無効。