ThreadPoolExecutorスレッドプール理論、飽和戦略、作業キューイング方式

このリンクします。https://blog.csdn.net/wangmx1993328/article/details/80582803
ディレクトリ

この記事REVIEW

簡単なスレッドプール

エグゼキュータ構造

スレッドプールを使用するメリット

スレッドプールの作品

スレッドプール飽和戦略

AbortPolicy

DiscardPolicy

DiscardOldestPolicy

ユーザー定義の拒否ポリシー(最も一般的)

スレッドプールの作業フロー・チャート

ジョブキューイング方式

SynchronousQueue

 LinkedBlockingQueue

ArrayBlockingQueue

この記事はじめに
この論文では、Javaのスレッドプールの理論的な知識について説明し
、新しいスレッドを作成するには、いくつかの方法がありますJavaでの?
継承スレッドまたはRunnableを実装し
、より高度なスレッドプール
のスレッドプールの説明
スレッドプールをJDK1.5も執行の枠組み、またはJava並行処理フレームワークとして知られ、初めに導入され
、一般的に使用されるjava.util.concurrentパッケージに関連するスレッドプールAPI次のクラスおよびインタフェースを
java.util.concurrent.Executor:唯一の方法が含まれているインタフェース、その抽象的な意味である:アクチュエータのRunnableタスク実行する
継承エグゼキュータ:java.util.concurrent.ExecutorServiceをインターフェイスインターフェイスは、タスクのライフサイクルを管理するための方法の多くを追加し、アクチュエータ
java.util.concurrent.ThreadFactory:新しいインターフェイスは、スレッドを生成します。ユーザは、このインタフェースの実装が管理するスレッドプールに論理スレッドを生成してもよい
java.util.concurrent.Executorsの各インスタンスのクラスの残りの部分に作成および戻り、そのようなもの基づく実行スレッドプールなどの異なるアクチュエータを生成する多くの実用的な方法を提供します実装。
java.util.concurrent.ThreadPoolExecutor:このクラスは、スレッドプールを維持しますが、それは新しいスレッドプールのスレッドを作成されていない、エグゼキュータで次の作業に提出するが、実行の使用が、タスクの実行時間の膨大な数のためには非常に短くします、あなたは大幅にタスクの実行のためのオーバーヘッドを減らすことができます。
構造Executorの
計算の結果を含む執行構造を行い、非同期タスク、タスク。
タスクには、呼び出し可能インタフェースまたはインタフェースようRunnableのような必要なインターフェースを実現するために実行すべきタスク、
コアインタフェースのタスクを含むキュータ実装メカニズムを、ならびに執行ExecutorServiceのインターフェースから継承:作業を行います。二つの重要な執行フレームExecutorServiceのクラスの実装が存在するインターフェイス(ThreadPoolExecutorおよびScheduledThreadPoolExecutorの)は、
非同期計算の結果:未来の未来のインタフェースクラスFutureTaskのインタフェースおよび実装を含みます


スレッドプールを使用する利点
リソース消費を減らすために:スレッドの作成と破壊を減らすために作成された再利用可能なスレッドは、消費によって引き起こされます。
応答速度を改善:タスクが到着すると、タスクは、スレッドの作成を直ちに実施することが可能になるまで待つ必要がないかもしれません。
スレッドが無制限の創造場合は、だけでなく、システムリソースを消費し、希少資源ですが、また、配信を統一することができ、スレッドプールを使用して監視およびチューニング、システムの安定性を減らす:スレッドの管理性を向上させる
作品スレッドプール
Aなどを:次のようにスレッドプールスレッド・プール・プロセスがあると、新しいタスクの提出後に
コアスレッドプールスレッドを決定するためのスレッド・プールが満杯になりました。タスクを実行するための新しいワーカースレッドの場合は完全な、創造。コアスレッドプールのスレッドは、第二段階満杯である場合。
スレッドプールは、作業キューが満杯であるかどうかを判断します。作業キューが満杯でない場合は、タスクが実行されるのを待って、新たに投入されたジョブキューに格納されます。作業キューがいっぱいの場合、第3のステップは実行されます。
スレッドプールスレッドプール(コアスレッドプールスレッドプールの外側部分)スレッドが状態を作動しているかどうかを決定します。ない場合は、タスクを実行するための新しいワーカースレッドを作成します。完全な場合には、飽和戦略にこのタスクに対処します。
スレッドプール飽和戦略の
一般的に使用される飽和戦略次のとおりです。
直接呼び出すことができます彼らはThreadPoolExecutorクラスの内部クラスです


AbortPolicy
この新しいタスクを実行するだけでなく、異常はありません戦略を遮断するJavaスレッドプールのデフォルト、キャッチをしようとするThreadPoolExecutor.execute必要性を覚えて、それ以外のプログラムはランタイムを投げる直接終了します。
DiscardPolicyが
直接捨てて、新しいタスクが実行されない、空のメソッドは
DiscardOldestPolicy
キュー内部の先頭からタスクを放棄し、再びこのタスクを実行します。
ユーザー定義の拒否ポリシー(最も一般的)
のRejectedExecutionHandlerを達成し、自らの政策のモードを定義するには
、スレッドプールの作業フロー・チャートを
例ThreadPoolExecutorスレッドプールのワークフローを表示します

 


スレッドが現在少なくcorePoolSizeより(カーネルスレッド)を実行している場合、タスク(このステップの実装はグローバルロックを取得する必要があることに注意してください)を実行するための新しいスレッドを作成します。
実行中のスレッドがcorePoolSize以上である場合、タスクはBlockingQueueの(キュー/タスクキューを遮断する)を添加します。
タスクのBlockingQueueを(キューがいっぱいです)参加できない場合は、タスク(このステップの実装はグローバルロックを取得する必要があることに注意してください)を処理するために、非corePoolで新しいスレッドを作成します。
あなたが現在maximumPoolSizeを超えるスレッドを実行する新しいスレッドを作成した場合、タスクが拒否され、そのように実行戦略、の飽和スレッドされます。RejectedExecutionHandler.rejectedExecution()メソッド。
ThreadPoolExecutor、このような措置を講じ、全体的なデザインのアイデアは、(深刻なボトルネックにスケーラブルになります)グローバルロックを取得避けるために、可能な限り、execute()メソッドで実行することです。予熱ThreadPoolExecutorの完了後(現在実行中のスレッドの数が以上corePoolSizeである)、ほとんど全てのexecute()メソッドの呼び出しが、ステップ2で実行され、ステップ2必要性グローバルロックを取得していません。
ジョブキューイング戦略は
、すでにスレッドプールのスレッドでワーカースレッドの合計数はコアの数を超えて、プラス新しいタスクが実行されるのを待って作業キューに置かれますとき言った
あなたはThreadPoolExecutorオブジェクトを作成する必要がスレッドプールを使用して、ThreadPoolExecutor(スレッド、プール)クラスを作成するコンストラクタが作業キューを指定したとき、それはBlockingQueueの<Runnableを>インタフェースであり、次のように使用され、このインタフェースの実装クラスの実際の開発に指定されています。
SynchronousQueueは
直接政策への----作業キューは、任意のタスクを保存していないという手段が実行されるのを待っているが、直接スレッドへの実行のために提出します。
デフォルトのオプションの作業キューは、それは、それらを保存せずに、スレッドのタスクに直接提出され、SynchronousQueueです。
スレッドがタスクを実行するために使用することができた場合は、すぐには存在しませんし、キューに参加しようとしているのタスクは失敗しますので、新しいスレッドを作成します。
この戦略は、要求セットを処理する内部依存性を有することができるときにロックが発生回避します。直接、多くの場合、提出を避けるために無限のmaximumPoolSizesを必要とし、新たに提出されたタスクを拒否。
newCacheThreadPool()スレッドプールを作成する方法の執行が、これはキューイングポリシーを使用することである
公共の静的ExecutorServiceのnewCachedThreadPool(){
新しい戻りて、新しいThreadPoolExecutor(0は、Integer.MAX_VALUE、
60L、TimeUnit.SECONDS、
新しい新しいSynchronousQueue <Runnableをを>());
}
 LinkedBlockingQueue
制限なしということ、あなたが待っているタスクの数に制限を追加することができますアンバウンド形式のキューポリシー----無制限の作業キューサイズの手段。
すべてのcorePoolSizeスレッドがビジー状態のときキューで待機して新しい仕事につながるアンバウンド形式のキューを使用してください。したがって、スレッドの作成は、corePoolSizeを超えることはありません。そのため、値maximumPoolSizeも無効です。そうcorePoolSizeは一般maximumPoolSizeを等しくさせ
、各タスクはタスクが互いに独立して実行される他のタスクから完全に独立である場合、使用するのに適した無限キュー 
方法のエグゼキュータは、戦略の行を使用することであるスレッドプール(int型nthreadsの値)を作成newFixedThreadPool
ExecutorServiceのnewFixedThreadPoolの静的パブリック(int型にnthreads){
新しいて、新しいThreadPoolExecutor(nthreadsの値、nthreadsの値、戻り
0L、TimeUnit.MILLISECONDS、
新しい新しいLinkedBlockingQueue <Runnableを>());
}
とArrayBlockingQueue
作業のキュー・サイズがあること有界キューポリシー----手段制限の
作業キューは無限のアドオンである場合、タスクは非常に危険ですので、利点は、枯渇が発生したリソースを防ぐためである
キューがいっぱいになるとき、それはスレッド飽和戦略実行される作業の後に
//コンストラクタスレッドプールを
ThreadPoolExecutorのThreadPool =て、新しいThreadPoolExecutor (3 ,. 4、
3、TimeUnit.SECONDS、
<Runnableを>(2)を使用して新しい新しいArrayBlockingQueue
新しい新しいThreadPoolExecutor.DiscardOldestPolicy());
コア糸3の上に、各スレッドのワークキューのサイズは2(すなわち、最大キューであります実行を待っている二つのタスク)、スレッドプール4内のスレッドの最大数
のワーカー・スレッドの数が少なく3に等しいより大きい場合、新しいスレッドが直接タスクを実行するように、3を超えると、タスクは、* 2 = 3作業キュー待ちに追加されます半年以上後のを待っているタスクの作業キューの数は、それが再び新しいスレッドを作成します。6、この時点で全体のスレッドプールのスレッドの総数は、この時点で飽和戦略を取る、追加するためのタスクがある場合は、4に達しています
 
----------------
免責事項:この記事は、元の記事のCSDNブロガー「カイ子孫」で、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースと、このリンクを添付してください声明。
オリジナルリンクします。https://blog.csdn.net/wangmx1993328/article/details/80582803

おすすめ

転載: www.cnblogs.com/mengen/p/11890520.html