ホームページ  >  記事  >  Java  >  スレッド プールを作成する 4 つの方法とは何ですか?

スレッド プールを作成する 4 つの方法とは何ですか?

青灯夜游
青灯夜游オリジナル
2020-12-10 12:02:3634362ブラウズ

メソッド: newCachedThreadPool はキャッシュ可能なスレッド プールを作成し、newFixedThreadPool は固定長のスレッド プールを作成し、newScheduledThreadPool は固定長のスレッド プールを作成し、newSingleThreadExecutor はシングルスレッド スレッド プールを作成します。

スレッド プールを作成する 4 つの方法とは何ですか?

#スレッド プールを作成する 4 つの方法

Java はエグゼキューター プールを通じて 4 つのスレッドを提供します、それぞれ:

1. newCachedThreadPool

newCachedThreadPool を使用して、キャッシュ可能なスレッド プールを作成します。スレッド プールの長さが処理の必要性を超えた場合、アイドル状態のスレッドを柔軟にリサイクルできます。 . リサイクルがない場合は、新しいスレッドを作成してください。

このタイプのスレッド プールの特徴は次のとおりです。

  • 作成されるワーカー スレッドの数にはほとんど制限がありません (実際には制限があります。数値は整数.MAX_VALUE) なので、スレッド プールにスレッドを柔軟に追加できます。

  • タスクがスレッド プールに長期間送信されない場合、つまり、ワーカー スレッドが指定された時間 (デフォルトは 1 分) アイドル状態である場合、ワーカー スレッドは自動的に終了します。終了後に新しいタスクを送信すると、スレッド プールはワーカー スレッドを再作成します。

  • CachedThreadPool を使用する場合は、タスク数の制御に注意しないと、同時に多数のスレッドが実行され、システムが麻痺する可能性があります。

サンプル コードは次のとおりです:

 package test;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
   public class ThreadPoolExecutorTest {
   public static void main(String[] args) {
   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  for (int i = 0; i < 10; i++) {
   final int index = i;
    try {
    Thread.sleep(index * 1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    cachedThreadPool.execute(new Runnable() {
     public void run() {
      System.out.println(index);
     }
    });
   }
  }
 }

2. newFixedThreadPool

を使用して、指定されたスレッド プールを作成します。ワーカースレッドの数。タスクがサブミットされるたびにワーカースレッドが作成され、ワー​​カースレッドの数がスレッドプールの初期最大数に達すると、サブミットされたタスクはプールキューに格納されます。

FixedThreadPool は典型的な優れたスレッド プールであり、スレッド プールによってプログラムの効率が向上し、スレッド作成時のオーバーヘッドが節約されるという利点があります。ただし、スレッド プールがアイドル状態のとき、つまりスレッド プールに実行可能なタスクがないときは、ワーカー スレッドは解放されず、特定のシステム リソースも占有します。

サンプル コードは次のとおりです。

 package test;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 public class ThreadPoolExecutorTest {
  public static void main(String[] args) {
   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
   for (int i = 0; i < 10; i++) {
    final int index = i;
    try {
     Thread.sleep(index * 1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    cachedThreadPool.execute(new Runnable() {
     public void run() {
      System.out.println(index);
     }
    });
   }
  }
 }

スレッド プール サイズが 3 であるため、各タスクはインデックスの出力後に 2 秒間スリープし、2 秒ごとに 3 つの数値が出力されます。

固定長スレッド プールのサイズは、Runtime.getRuntime().availableProcessors() などのシステム リソースに応じて設定するのが最適です。

3. newSingleThreadExecutor

を使用してシングルスレッド Executor を作成します。つまり、タスクを実行するための一意のワーカー スレッドのみを作成します。これは唯一のワーカーのみを使用します。タスクを実行するには、すべてのタスクが指定された順序 (FIFO、LIFO、優先順位) で実行されるようにしてください。このスレッドが異常終了した場合は、順次実行を保証するために別のスレッドに置き換えられます。単一ワーカー スレッドの最大の特徴は、タスクが順番に実行され、同時に複数のスレッドがアクティブになることがないことを保証できることです。

サンプル コードは次のとおりです:

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  for (int i = 0; i < 10; i++) {
   final int index = i;
   singleThreadExecutor.execute(new Runnable() {
    public void run() {
     try {
      System.out.println(index);
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
    }
   });
  }
 }
}

4. newScheduledThreadPool

を使用して、固定長のスレッド プールを作成し、スケジュールされた定期的なタスクをサポートします。実行。スケジュールされた定期的なタスクの実行をサポートします。

実行を 3 秒遅延します。遅延実行のサンプル コードは次のとおりです。

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  scheduledThreadPool.schedule(new Runnable() {
   public void run() {
    System.out.println("delay 3 seconds");
   }
  }, 3, TimeUnit.SECONDS);
 }
}

は、1 秒の遅延後に 3 秒ごとに実行されることを意味します。定期実行のサンプル コード

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
 public static void main(String[] args) {
  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
   public void run() {
    System.out.println("delay 1 seconds, and excute every 3 seconds");
   }
  }, 1, 3, TimeUnit.SECONDS);
 }
}

続き プログラミング関連の知識については、

プログラミング学習 Web サイト をご覧ください。 !

以上がスレッド プールを作成する 4 つの方法とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。