JavaThreadPoolExecutorクラスのパラメーターの説明

Java ThreadPoolExecutor

@author:Jingdai
@date:2020.11.03

最近、本によく出てくる「Java並行プログラミング実践戦闘」という本を読んだのThreadPoolExecutorですが、あまり馴染みがないので、勉強して簡単にまとめました。

基本概念

ThreadPoolExecutorこのクラスはスレッドプールです。前のこの本の「Javaコアテクノロジー、ボリューム1」を参照してください。Executorsメソッドなどのスレッドプールクラスの静的メソッドを作成するために導入できます。Executors.newCachedThreadPool()実際にはThreadPoolExecutor、コンストラクターを呼び出して作成することできます。スレッドプールはい、後で導入されます。しかし、Alibaba Java開発マニュアルを読むとExecutors、図1に示すように、クラスを使用してスレッドプールを作成することはできません

ここに画像の説明を挿入します

したがってThreadPoolExecutor、クラスの使用法について学ぶことは非常に必要です。

コンストラクターパラメーター

ThreadPoolExecutorこのクラスには、スレッドプールを作成するための4つのコンストラクターがあります。それらは次のとおりです。

  • ThreadPoolExecutor(int corePoolSize、int maximumPoolSize、long keepAliveTime、TimeUnit unit、BlockingQueue workQueue)
  • ThreadPoolExecutor(int corePoolSize、int maximumPoolSize、long keepAliveTime、TimeUnit unit、BlockingQueue workQueue、RejectedExecutionHandlerハンドラー)
  • ThreadPoolExecutor(int corePoolSize、int maximumPoolSize、long keepAliveTime、TimeUnit unit、BlockingQueue workQueue、ThreadFactory threadFactory)
  • ThreadPoolExecutor(int corePoolSize、int maximumPoolSize、long keepAliveTime、TimeUnit unit、BlockingQueue workQueue、ThreadFactory threadFactory、RejectedExecutionHandlerハンドラー)

今、個々のパラメータは、ここで簡単に紹介されている最初の導入corePoolSizemaximumPoolSizeそしてworkQueue、彼らは相互にされているとして、3つのパラメータを。

corePoolSize :スレッドプール内のコアスレッドの数

maximumPoolSize :スレッドプール内のスレッドの最大数

workQueue :スレッドプールによって使用されるブロッキングキュー。ここでは主にその長さに関係します

まず想定さcorePoolSizemaximumPoolSize及びworkQueue長さが0よりも整数大きいです。task以下に示すように、4つのケースで新しいタスクが到着します。

ここに画像の説明を挿入します

  1. スレッドプール内のスレッド数が<のcorePoolSize場合、新しいコアスレッドが作成され、タスクが実行のためにスレッドプールに渡されます。
  2. スレッドプール内のスレッド数> =corePoolSizeであり、ブロッキングキューworkQueueがいっぱいでない場合、新しいタスクはブロッキングキューに配置されて待機します。
  3. スレッドプール内のスレッドcorePoolSize> =およびスレッドプールスレッド数<でmaximumPoolSize、キューのブロックworkQueueがいっぱいになると、新しい非コアスレッドが作成され、委任されたタスクが実行されます。
  4. スレッドプールスレッドの数=のmaximumPoolSize場合、ブロッキングキューworkQueueがいっぱいである間、タスクは拒否されます。彼は拒否しました。特定の処理は後で導入されます。

workQueueキューが無限であるときにブロックキューが設定されている場合(たとえば、事前定義されたボリュームLinkedBlockingQueueがない場合)、それmaximumPoolSize役に立ちませんが終了するcorePoolSizeと、タスクは常にブロッキングキューに追加されますが、ブロッキングキューがいっぱいではない場合、非コアスレッドが作成されることはありません。

keepAliveTime :スレッドキープアライブ時間

unit :スレッドが存続する時間の単位

スレッドプール内のスレッド数がを超えるcorePoolSizeと、超過スレッドアイドル時間が上記パラメータで設定した時間を超えると破棄されます。デフォルトでは、corePoolSize時間の経過に伴うプール内のスレッド数の場合にのみ、この戦略が実装allowCoreThreadTimeOut(boolean)されますが、ポリシーメソッドに設定することでコアスレッドも適用されます。

handler :タスクプロセッサを拒否します

スレッドプールが閉じているか、スレッドプールの容量がいっぱい(workQueueいっぱいmaximumPoolSizeで、プール内スレッドの数が)である場合、タスクをスレッドプールに送信すると、タスクプロセッサの作業が拒否されます。4つの事前定義された拒否ハンドラーがあります。

  1. ThreadPoolExecutor.AbortPolicy:デフォルトで拒否されたプロセッサRejectedExecutionExceptionタスクの例外時にスローすることを拒否しました
  2. ThreadPoolExecutor.CallerRunsPolicy:タスクを送信するスレッドに、送信されたタスクを単独で実行させます。たとえば、メインスレッドがタスクをスレッドプールに送信し、スレッドプールによって拒否された場合、メインスレッドはそれ自体でタスクを実行します。
  3. ThreadPoolExecutor.DiscardPolicy :実行できないタスクを直接破棄します。
  4. ThreadPoolExecutor.DiscardOldestPolicy:スレッドプールが閉じられていない場合、ブロックキュースレッドプールworkQueueは最初のタスクを破棄してから、再実行を試みます。

その他の関連する方法

上記はコンストラクターの関連パラメーターについて説明していますが、同時に、スレッドプールの作成後に、関連パラメーターを変更することもできます。

  • getCorePoolSize()setCorePoolSize(int corePoolSize)

    名前からわかるように、スレッドプール内のコアスレッドの数を表示および変更できます

  • getMaximumPoolSize()setMaximumPoolSize(int maximumPoolSize)

    スレッドプール内のスレッドの最大数を表示および変更する

  • setKeepAliveTime(long time, TimeUnit unit)

    スレッドが非アクティブの場合に破棄される期間を設定します

その他

Executors本質的にスレッドプールを作成する上記の静的メソッドもThreadPoolExecutorコンストラクターの呼び出しです。jdk8のソースコードを見てください。

public static ExecutorService newFixedThreadPool(int nThreads) {
     
     
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newCachedThreadPool() {
     
     
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

ここでは本質が同じであることがわかります。したがって、この構築方法でスレッドプールを作成すると、スレッドプールのさまざまなパラメーターをより明確に知ることができます。

参照

  • Java 8 API

おすすめ

転載: blog.csdn.net/qq_41512783/article/details/109473365