ホームページ  >  記事  >  Java  >  Java ThreadPoolExecutor パラメータを深く理解するためのサンプル コード分析

Java ThreadPoolExecutor パラメータを深く理解するためのサンプル コード分析

黄舟
黄舟オリジナル
2017-03-23 10:25:031866ブラウズ

この記事では主に Java ThreadPoolExecutor のパラメータを深く理解するための関連情報を紹介します。必要な方は参考にしてください。スレッドプールを作成する

スレッドを作成する前に ExecutorのnewFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()の3つのメソッドが常に使用されます。もちろん、Executor も new ThreadPoolExecutor に対して異なるパラメーターを使用します

1. newFixedThreadPool()

固定数のスレッドでスレッド プールを作成します。 LinkedBlockingQueueを使用するため、maximumPoolSizeは役に立ちません。 corePoolSizeがいっぱいの場合、LinkedBlockingQueuequeueに追加されます。スレッドが実行を完了するたびに、LinkedBlockingQueue キューから 1 つを取得します。つまり、これは固定サイズのスレッドプールを作成することになります。

 public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                   0L, TimeUnit.MILLISECONDS,
                   new LinkedBlockingQueue<Runnable>());
  }
 public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue) {
   this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
       Executors.defaultThreadFactory(), defaultHandler);
  }

2.newSingleThreadPool()

スレッド番号 1 のスレッド プールを作成します。 LinkedBlockingQueue を使用するため、maximumPoolSize は役に立ちません。 corePoolSize 1 は、スレッドの数が 1 であることを意味します。 いっぱいになると、キューに入れられ、キューから 1 つを取得するだけで実行が完了します。

 public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
      (new ThreadPoolExecutor(1, 1,
                  0L, TimeUnit.MILLISECONDS,
                  new LinkedBlockingQueue<Runnable>()));
  }

3.newCachedThreadPool()

バッファ可能なスレッドプールを作成します。サイズ制限はありません。 corePoolSize が 0 であるため、タスクは SynchronousQueue キューに入れられます。SynchronousQueue はサイズ 1 しか格納できないため、新しいスレッドがすぐに開始されます。 。メモリサイズによって制限されます。

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                   60L, TimeUnit.SECONDS,
                   new SynchronousQueue<Runnable>());
  }
public ThreadPoolExecutor(int corePoolSize,
             int maximumPoolSize,
             long keepAliveTime,
             TimeUnit unit,
             BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
       Executors.defaultThreadFactory(), defaultHandler);
  }

2. ThreadPoolExecutor を使用してスレッド プールを作成します

ThreadPoolExecutor の

コンストラクター

 public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue,
               ThreadFactory threadFactory,
               RejectedExecutionHandler handler) {
    if (corePoolSize < 0 ||
      maximumPoolSize <= 0 ||
      maximumPoolSize < corePoolSize ||
      keepAliveTime < 0)
      throw new IllegalArgumentException();
    if (workQueue == null || threadFactory == null || handler == null)
      throw new NullPointerException();
    this.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
  }

パラメータ: スレッド数が

2、maximumPoolSize はスレッドの最大数です。スレッド数 >= corePoolSize の場合、ランナブルは workQueue に置かれます。 3. keepAliveTime スレッド数が最大の corePoolSize より大きい場合のキープアライブ時間。アイドル状態のスレッドが存在できる時間。

4. 単位時間単位

5. workQueue はタスクのブロッキングキューを保存します

6. threadFactory はスレッドファクトリーを作成します

7. ハンドラー拒否戦略

タスクの実行順序:

1.スレッドが corePoolSize より小さい場合、タスクを実行するためにスレッドが作成されます。

2. スレッド数が corePoolSize 以上で、workQueue が満杯でない場合、workQueue に投入します

3. スレッド数が corePoolSize 以上で、workQueue が満杯の場合、新しいタスクを実行するために新しいスレッドが作成され、スレッドの合計数はmaximumPoolSize 4未満である必要があります。 スレッドの合計数がmaximumPoolSizeに等しく、workQueueがいっぱいの場合、ハンドラーのrejectedExecutionが実行されます。それが拒否戦略です。

ThreadPoolExecutor にはデフォルトで 4 つの拒否ポリシーがあります:

1. ThreadPoolExecutor.AbortPolicy() は直接例外をスローします

RejectedExecutionException 2. ThreadPoolExecutor.CallerRunsPolic y() run メソッドを直接呼び出して実行をブロックします

3.スレッドプールエグゼキュータ。 DiscardPolicy() 後続のタスクを直接破棄します

4. ThreadPoolExecutor.DiscardOldestPolicy() キューの先頭にあるタスクを破棄します

もちろん、

RejectedExecutionHandler を継承して拒否ポリシーを記述することもできます

rreee。

以上がJava ThreadPoolExecutor パラメータを深く理解するためのサンプル コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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