序文
スレッドプールといえば、私は何も知らない人は、特に「のために、インタビューで尋ねなければならない問題の一つに属していないことが確信して高い同時実行基本的にポイントを聞いてきます、企業のための高い要件に」。オンライン多くの記事やビデオのスレッドプールについて、この記事では、あなたはすぐにスレッドプールの基本原則を理解し、習得するために設計された高度なアプリケーションのためのより多く関与しています。
ディレクトリ
- 同時キュー
- はじめにスレッドプール
- なぜ我々は、スレッドプールが必要なのか
- 原理スレッドプール
- スレッドプールの分類
同時キュー
1.同時キューの概念
同時キューは、それが私たちが要素を取得するとき、それは意志、キューの末尾に追加されたとき、我々は要素を追加するときには、FIFOルールのソートノードを使用して、リンクノードに基づく、アンバウンド形式のスレッドセーフなキューですキューの要素ヘッドを返します。
2.分類同時キュー
キューキューと非ブロッキング、以下の例示的な実施例ブロッキングへ並行キュー:
キュー10の従来の長さを、11個の要素がある置く必要
概略を
キューの2種類の違い
-
エンキューすると
、非ブロッキングキュー:キューに要素が10を、キューは、この時点でいっぱいですし、最初の要素に11件のデータが失われます。
キューをブロック:キュー内の要素は、その後、最初の11は再び生きて来たときにキューがいっぱいになる時間を、そしてチームでお待ちしております。 -
デキューすると
ノンブロッキングキューを:なしキュー要素、この時点でのデキュー操作は、取得した要素を取り出していない場合はnullです。
キューをブロック:キューに要素が存在しない場合、その後取り出したときに入れたときに、この時点でチームは、操作を待つことになる場合。
具体的には、スレッドプールが基づいているキューのブロッキングの実装を。
第二に、スレッドプールのプロフィール
スレッドプールは処理タスクがキューに追加されます、スレッドプールは、システムの起動時にアイドル状態のスレッドの数が多いを作成することで、プログラムがタスクスレッドプールを通過しますマルチスレッド処理の形で、スレッドプールは、実行するスレッドを開始しますこのタスク。実行終了後、スレッドは死なないが、次のタスクを待って、アイドル状態になり、再びスレッドプールに戻ります。
簡単に言えば、それは、スレッドプールのスレッドのコレクションです。
第三に、なぜスレッドプール
スレッドの通常のライフサイクル下図のように:
分析のために、時間として示した様々な段階は、(もちろん、各ステージはミリ秒単位で、非常に短い時間がかかり、実際のスレッド)を費やしたと仮定します。私たちは他のステージを省略することができる場合の処理タスクが5秒を保存することができますが、シングルスレッドのことができるように、各スレッドは、タスクを実行します。スレッドプールのスレッドへのタスクのキューが直接作業を行うことができたときに、プール内のスレッドが以前にアイドル多数のスレッドを作成しているため、このビジョンを実現するために、我々は実行の完了後にリソースを解放、処理するためにスレッドプールを使用することができます、次のタスクの処理を続けます。
たとえば、見て:既存の100個のタスクは、一度10スレッドまで作成し、対処する必要があります。通常の方法ならば、10個のスレッドを作成するためには、10個のタスクは、合計必要が取り扱う60スレッドは、10のタスクの実行後に、合計道をプールしながら、秒を10秒。
要約すると:我々は明らかに非常に並行システムに大量の処理タスク内のスレッドプールは、大きな利点を持っていることがわかります。
第四に、スレッドプールの原則
1. ThreadPoolExecutorのコアクラス
スレッドプール最上層インターフェースが執行され、このインターフェースは、この方法は、タスク、最終的にThreadPoolExecutorクラスの実装を渡すために使用されている(Runnablecommand)コアメソッドが実行定義します。次のようにThreadPoolExecutorは、このクラスのコアスレッドプールのクラスのコンストラクタです。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnitunit,BlockingQueue<Runnable>workQueue,RejectedExecutionHandler handler);
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
各パラメータには意義を示しています。
パラメーター名 | パラメータ意味 |
---|---|
corePoolSize | コアスレッドプールのサイズの数は、そのコア糸であります |
maximumPoolSize | 最大スレッドプールサイズの最大数、そのスレッド |
keepAliveTimeが | アイドル時間は、コアスレッド以外の新しく作成されたスレッドの最大生存時間であります |
TIMEUNIT | 時間単位 |
ワークキュー | タスクに店舗を待って、待ち行列をブロック |
threadFactory | 新しいスレッドの作成に使用するスレッドファクトリ |
ハンドラ | 治療戦略を拒否し、スレッドプールに提出したタスクの量が最大スレッドプールのサイズ+キューの長さを超えた場合に、治療戦略を拒否かかります |
具体的に次のように述べています
:ワークキューは、一般的に次の三つのブロッキングキュー持っ
SynchronousQueue:デフォルトのキューの使用、直接提出
ArrayBlockingQueueを:有界キュー
LinkedBlockingQueue:アンバウンド形式のキューを
threadFactoryキューがいっぱいですが、スレッド<最大スレッドプールサイズの合計数は、スレッドプールのスレッドファクトリで新しいスレッドを作成するとき。:一般的には3つのタイプがあります。
ArrayBlockingQueue:有界スレッドセーフなブロッキングキューを。
LinkedBlockingQueue:同時安全なブロッキングキュー。
SynchronousQueue:同期キュー。
:ハンドラがトリガされると、それは次の4つの戦略に対処することを拒否した
hreadPoolExecutor.AbortPolicy(デフォルト):RejectedExecutionExceptionタスクを破棄し、例外をスローします。
ThreadPoolExecutor.DiscardPolicy:タスクが破棄されますが、例外をスローしません。
ThreadPoolExecutor.DiscardOldestPolicy:一番のタスクキューを破棄し、再度(このプロセスを繰り返し)タスクを実行しよう
ThreadPoolExecutor.CallerRunsPolicy:このタスクは、呼び出し元のスレッドによって処理されます
2.スレッドプールの回路図
3.スレッドプールの例
次に基本的な原則のスレッドプールを理解するための模式的に連動して簡単な例を通して:
public class test02 {
public static void main(String[] args) {
ThreadPoolExecutor pool =
new ThreadPoolExecutor(1,2,3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3));
//利用线程池中的线程开始执行任务
//执行第一个任务
pool.execute(new TestThread());
//队列有三个任务等待
pool.execute(new TestThread());
pool.execute(new TestThread());
pool.execute(new TestThread());
//执行第五个任务
pool.execute(new TestThread());
//执行第六个任务,拒绝任务报错
//pool.execute(new TestThread());
//当前线程池中有2个线程:1个核心线程 + 1个新创建的线程 = 最大线程数
//关闭线程池
pool.shutdown();
}
}
class TestThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
スレッドプール、コンストラクタのみ5つのパラメータの単純型を作成することによって開始し、次のような意味のそれぞれ:
1:スレッドのコア番号
2:スレッドの最大数は
3:空き時間。新しく作成されたタスクの実行スレッドのアイドル時間後に新しいジョブを待って
TimeUnit.SECONDS:時間の単位、秒単位で
新しいLinkedBlockingDeque:遮断するキューの長さが3であります
第6条の履行の結果は次のタスクを実行しない場合:
次のようにタスク実行結果の第6条の実装は以下のとおりです。
解析コードの実行:
既存のスレッドプールは、1つのコアだけのスレッドがありますスレッド1によって、スレッドプールへの最初のタスクスレッド1ので、新しいスレッドのスレッド2を作成し、ジョブ投入5号、概略図、キューを満たすために、この時間がいっぱいになる実行のためのスレッドのキュー、および新しいコア+ <=最大で実行され、2-4、スレッド1そして、共有タスクスレッド2、それはまた、確かに、業績が見ることができるタスクを共有します。
セクション6のタスク、キューが一杯になる模式図、及び新たなコア+>最大と結合するとき、余分なスレッド実行タスク待ち行列をロードすることはできません、エラーがタスクを拒否します。
第五に、スレッドプールの分類
スレッドプールは、次の4つのカテゴリに分けることができます。
1.キャッシュ可能:newCachedThreadPool
-
役割:必要に応じて新しいスレッド・プールを作成するスレッドプールを作成します。ときリソースの解放後に古いスレッドには、古いスレッドを使用することができます。
-
特徴:スレッドの柔軟な最大数は、同様の基本的なキューボーダレスを使用して、INTER.MAX_VALUEです
2.固定長:newFixedThreadPool
-
役割:これらのスレッドを実行するために、共有アンバウンド形式のキューにスレッドの固定数を再利用するスレッドプールを作成します。
-
特徴:スレッドが一定量であり、あなたも並行性を制御することができます
3.タイミング:newScheduleThreadPool
-
役割:スレッドプールを実行している遅延や拡張機能を作成します。
-
特徴:スレッドプールスレッドの指定された数を有する、または周期的シーン実行されるタスクのタイミング遅延実行してもよいです。
例4.シングル:newSingleThreadExecutor
- 役割:一つだけのスレッドは、スレッドプールを作成します。在庫タイムスレッドは、スレッドがビジー状態であるとき、新しいタスクが無制限のブロッキングキューに入りますが、無限です。
- 特徴:タスクが実行するシーンのために。
著作権:
1.このブログは、オリジナルの記事で、私は待っていますあなたのすべてにロマンチックで、元の作者に属します。
2.許可証は、この記事の原作者なしに複製してはならない、または侵害とみなされます。
3.転載または引用この記事は、ソースと作者を明記してください。
自身が法律に基づいて調査する権利を保持して、この記事のこの声明またはその他の不正な使用の不遵守のために4。