序文のJava プログラムの猿、スレッドプールは、高周波の面接の質問で、私たちはスキルを習得する必要があり、この記事であなたを与える4つの主要なスレッドプールを使用しています。
はじめにスレッドプール
スレッドプールの概念:
スレッドプールは、そのセットは、スレッドプールと呼ばれ、最初のいくつかのスレッドを作成することです。スレッドプールは、システムの起動時にアイドル状態のスレッドの数が多いを作成することです、スレッドプールが良く、性能を向上させることが使い、プログラムは、スレッドプールは、実行の終了後に、このタスクを実行するスレッドを開始します、スレッドをタスクスレッドプールを通過しますそして死ぬが、次のタスクを待って、アイドル状態になったスレッド・プールに再び戻っていません。
スレッドプールのメカニズム:
プログラミングモードスレッドプールでは、タスクではなく、スレッドに直接提出全体のスレッドプールに提出されるべきであり、存在する場合、内部のアイドルスレッドクロスの後、仕事があるかどうかを調べるためにそれを得ることにスレッドプールのタスクアイドルスレッドへ。
スレッドは、同時に一つのタスクを実行することができますが、スレッドプールに同時に複数のタスクを提出することができます。
スレッドプールの理由を使用します。
マルチスレッド実行時、システム常に新しいスレッドの起動と停止、コストが非常に高く、移行はシステムリソースを消費し、システムリソースの崩壊につながる可能性がスレッドを切り替えるトランジションの危険ます。この場合、スレッドプールが最良の選択です。
詳細な一般的な4つのスレッドプール
4.1 Executors.newCacheThreadPool()
Executors.newCacheThreadPool() :キャッシュ可能なスレッドプールは、プールが以前に存在する場合、それは直接使用され、設立参照するには何のスレッドがありません。そうでない場合は、プール、一般的なタスクのいくつかの非同期短いの寿命を実行するために使用される池・キャッシュ・タイプに参加する新しいスレッドを構築
コード:
- 輸入 java.util.concurrent.ExecutorService。
- 輸入 java.util.concurrent.Executors。
- パブリック クラス ThreadPoolExecutorTest {
- パブリック 静的 ボイド メイン(文字列[]引数){
- // スレッドプールを作成してキャッシュ可能
- ExecutorServiceのcachedThreadPool = Executors.newCachedThreadPool()。
- 以下のために (int型 、iは10 <; I = 0 iは++){
- してみてください {
- //睡眠は、新しいスレッドを作成していない、前スレッドプールのスレッドを使用して内部をはっきりと見ることができます
- Thread.sleep(1000);
- } キャッチ (InterruptedExceptionある電子){
- e.printStackTrace();
- }
- cachedThreadPool.execute(新しい Runnableを(){
- 公共 ボイド ラン(){
- // キャッシュスレッドが印刷を実行しています
- System.out.println(にThread.currentThread()のgetName() + " 実行されています");
- }
- });
- }
- }
- }
現在のタスクの実行は、スレッドの実行上の複雑な作業ではなく、毎回新しいスレッドになるときに、タスクが完了した上でスレッド・プールは、無限です
4.2 Executors.newFixedThreadPool(INT n)が
Executors.newFixedThreadPool(N-intは):再利用可能なスレッドプールの固定数を作成し、共有無制限キュースレッドが実行します。
コード:
- パッケージ com.study.test。
- 輸入 java.util.concurrent.ExecutorService。
- 輸入 java.util.concurrent.Executors。
- パブリック クラス ThreadPoolExecutorTest {
- パブリック 静的 ボイド メイン(文字列[]引数){
- // スレッドプールの再利用可能な固定数を作成します
- ExecutorServiceのfixedThreadPool = Executors.newFixedThreadPool(3)。
- 以下のために (int型 、iは10 <; I = 0 iは++){
- fixedThreadPool.execute(新しい Runnableを(){
- 公共 ボイド ラン(){
- してみてください {
- // キャッシュスレッドが印刷を実行しています
- System.out.println(にThread.currentThread()のgetName() + " 実行されています");
- Thread.sleep(2000);
- } キャッチ (InterruptedExceptionある電子){
- e.printStackTrace();
- }
- }
- });
- }
- }
- }
- }
4.3 Executors.newScheduledThreadPool(int型n)は、
Executors.newScheduledThreadPool(N-INT) :レギュラー及び周期的なタスクの実行をサポートするために、固定長のスレッドプールを作成します
コード:
- パッケージ com.study.test。
- 輸入 java.util.concurrent.Executors。
- 輸入 java.util.concurrent.ScheduledExecutorService。
- 輸入 java.util.concurrent.TimeUnit。
- パブリック クラス ThreadPoolExecutorTest {
- パブリック 静的 ボイド メイン(文字列[]引数){
- // 通常の定期的なタスクの実行をサポートするために、固定サイズのスレッドプールを作成します- 遅延実行を
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5)。
- // 遅延の1つのミャオ族の実行
- scheduledThreadPool.schedule(新しい Runnableを(){
- 公共 ボイド ラン(){
- System.out.println( " 遅延1。実行秒");
- }
- }、1、TimeUnit.SECONDS)。
- }
- }
出力結果:遅延。1 秒間に実行
コード 2 :タイミングを行うことができます
- パッケージ com.study.test。
- 輸入 java.util.concurrent.Executors。
- 輸入 java.util.concurrent.ScheduledExecutorService。
- 輸入 java.util.concurrent.TimeUnit。
- パブリック クラス ThreadPoolExecutorTest {
- パブリック 静的 ボイド メイン(文字列[]引数){
- // 通常の定期的なタスクの実行をサポートするために、固定サイズのスレッドプールを作成- 定期的に
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5)。
- // ディレイ1 の後に毎秒3 秒を実行するには、
- scheduledThreadPool.scheduleAtFixedRate(新しい Runnableを(){
- 公共 ボイド ラン(){
- System.out.println(「ディレイ1 秒ごとの後に3 秒に実行します」);
- }
- }、1、3、TimeUnit.SECONDS)。
- }
- }
4.4 Executors.newSingleThreadExecutor()
Executors.newSingleThreadExecutorは() :シングルスレッドのスレッドプールを作成し、指定された順序でそのすべてのタスクを確認するためにタスクのみワーカースレッドを実行するためにのみ使用し(FIFO、LIFO、優先順位)実行を。
- パッケージ com.study.test。
- 輸入 java.util.concurrent.ExecutorService。
- 輸入 java.util.concurrent.Executors。
- パブリック クラス TestThreadPoolExecutor {
- パブリック 静的 ボイド メイン(文字列[]引数){
- ExecutorServiceのsingleThreadExecutor = Executors.newSingleThreadExecutor()。
- 以下のために (int型 、iは10 <; I = 0 iは++){
- 最終 int型 のインデックス= I;
- singleThreadExecutor.execute(新しい Runnableを(){
- 公共 ボイド ラン(){
- してみてください {
- // これは、各タスクのための実装に相当順次出力されます
- System.out.println(にThread.currentThread()のgetName() +は" 実行されて、印刷の値は" +指数);
- Thread.sleep(1000);
- } キャッチ (InterruptedExceptionある電子){
- e.printStackTrace();
- }
- }
- });
- }
- }
- }