Java
 Computer >> コンピューター >  >> プログラミング >> Java

固定スレッドプールとキャッシュスレッドプールの違い。


エグゼキュータフレームワークは、スレッドプールの概念を使用して設計されています。スレッドプールは、現在のタスクを実行するたびに新しいスレッドを作成するのではなく、作成済みのスレッドを再利用する方法です。

Executorsクラスは、スレッドプールを作成するためのファクトリメソッドを提供します。 ThreadPoolExecutorクラスは、多くのエグゼキュータファクトリメソッドから返されるエグゼキュータの基本実装です。

Sr。いいえ。 キー 固定スレッドプール キャッシュされたスレッドプール
1
基本
JavaDocによる-
共有の無制限キューで動作する固定数のスレッドを再利用するスレッドプールを作成します。どの時点でも、最大でnThreadsスレッドがアクティブな処理タスクになります。すべてのスレッドがアクティブなときに追加のタスクが送信されると、スレッドが使用可能になるまでキューで待機します。シャットダウン前の実行中に障害が発生したためにスレッドが終了した場合、後続のタスクを実行するために必要な場合は、新しいスレッドが代わりに使用されます。プール内のスレッドは、明示的にシャットダウンされるまで存在します。
JavaDocによる-
必要に応じて新しいスレッドを作成するスレッドプールを作成しますが、以前に作成されたスレッドが利用可能になったときに再利用します。これらのプールは通常、多くの短期間の非同期タスクを実行するプログラムのパフォーマンスを向上させます。実行する呼び出しは、利用可能な場合、以前に構築されたスレッドを再利用します。使用可能な既存のスレッドがない場合は、新しいスレッドが作成され、プールに追加されます。
2
キュー
ブロッキングキューを使用します。


SynchronousQueueを使用します
列 。


3
スレッドの有効期間
明示的に終了するまで、すべてのスレッドを実行し続けます
60秒間使用されなかったスレッドは終了し、キャッシュから削除されます
4。
スレッドプールサイズ
スレッドプールのサイズは固定されているため、大きくなりません。
スレッドプールはゼロスレッドからInteger.MAX_VALUEに拡張できます
5。
ユースケース
並行タスクを制限したい場合は、fixedthreadpoolを使用する必要があります
予測可能なタスクがたくさんある場合に使用できます。

固定スレッドプールの例

public class Main {
   public static void main(String args[]) throws InterruptedException {
      ExecutorService executors = Executors.newFixedThreadPool(4);
      CountDownLatch latch= new CountDownLatch(2);
      executors.submit(new Service1(latch));
      executors.submit(new Service2(latch));
      latch.await();
      System.out.println("Done");
   }

import java.util.concurrent.CountDownLatch;
public class Service1 implements Runnable {
   CountDownLatch latch;
   public Service1(CountDownLatch latch) {
      super();
      this.latch = latch;
   }
   @Override
   public void run() {
      try {
         Thread.sleep(20000);
      } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
         latch.countDown();
         System.out.println("Services2"+latch.getCount());
      }
   }
   import java.util.concurrent.CountDownLatch;
   public class Service2 implements Runnable {
      CountDownLatch latch;
      public Service2(CountDownLatch latch) {
         super();
         this.latch = latch;
      }
      @Override
      public void run() {
         try {
            Thread.sleep(20000);
         } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   latch.countDown();
   System.out.println("Services2"+latch.getCount());
   }
}

  1. Javaでのスレッドとランナブルの違い

    新しい実行スレッドを作成するには、2つの方法があります。 1つは、クラスをThreadクラスのサブクラスとして宣言することです。このサブクラスは、Threadクラスのrunメソッドをオーバーライドする必要があります。その後、サブクラスのインスタンスを割り当てて開始できます。 スレッドを作成するもう1つの方法は、Runnableインターフェースを実装するクラスを宣言することです。次に、そのクラスはrunメソッドを実装します。次に、クラスのインスタンスを割り当て、スレッドの作成時に引数として渡して、開始することができます。 すべてのスレッドには、識別のための名前があります。複数のスレッドが同じ

  2. Javaでの例外とエラーの違い

    例外とエラーはどちらもThrowableクラスのサブクラスです。このエラーは、主にシステムリソースの不足が原因で発生する問題を示しており、アプリケーションはこれらのタイプの問題をキャッチするべきではありません。エラーの例としては、システムクラッシュエラーやメモリ不足エラーなどがあります。エラーは主に実行時に発生し、チェックされていないタイプに属します。 例外は、実行時およびコンパイル時に発生する可能性のある問題です。これは主に、開発者によって作成されたコードで発生します。例外は、チェックされた例外とチェックされていない例外などの2つのカテゴリに分類されます。 Sr。いいえ。 キー