同時学習プログラム-分かりやすいThreadPoolExecutor 06
4721 ワード
今日はThreadPoolExecutorを勉強して、このクラスがどのように定義されているかを見てみましょう.
ここを見て、何か感じがしますか.このクラスはAbstractExecutorServiceを直接継承しています.私は『AbstractExecutorService』という文章でAbstractExecutorServiceについて話したことがあります.皆さんはまだ印象がありますか.AbstractExecutorServiceは抽象的なクラスで、私が前回どのようにこのクラスを説明したか見てみましょう.
AbstraactExecutorServiceの中の方法はこの4つのスタイルです.shutdownはタスクを閉じるTerminatedを表してタスクsubmitを中断してrunnable実行タスクinvokeを提供して実行するタスクを準備して、AbstractExecutorServiceはすでに自主的にsubmitとinvokeのタイプの方法を実現して、つまりタスクの手配を私たちに規定したので、私たちはAbstractExecutoriceサービスというクラスを使用するならば、痛くも痒くもないshutdownやTerminatedタイプを実現する方法だけでいいです.
AbstractExecutorServiceを継承したThreadPoolExecutorを見てみましょう.抽象的ではなく、完璧なクラスです.どんな方法でも書いてくれます.私たちはこのクラスを使うことをマスターすればいいだけです.便利ですね.
まず、ThreadPoolExecutorクラスの構造方法を見てみましょう.構造方法は4つありますが、効果は同じで、パラメータが異なるだけです.しかし、この4つの構造方法には共通の5つのパラメータがあり、それぞれ:
各パラメータの意味をそれぞれ説明する(完全な個人理解、公式解釈ではない):corePoolSize:スレッドプールに既存のスレッド数maximumPoolSize:最大どれだけのタスクを実行するかkeepAliveTime:スレッドなどのタスクをアイドルする時間、古い時間はunitを待たない:時間単一ワークQueue:まだ実行されていないタスクを保存する
以上は4つの构造方法が共有するパラメータですが、次にパラメータが一番多い构造方法の他のパラメータは何ですか.それぞれ以下の2つです.
これらのパラメータは何をしているのか説明します:threadFactory:スレッドを作成する場所handler:キュー容量を超えるタスクはhandlerで処理します
これらの説明を見ると、必ずしもこれらのパラメータの意味を悟ることができるとは限らないと思います.完全な概念を与えるために、私は類比の方法でこれらのパラメータの意味を感じさせます.
構築方法:
ThreadPoolExecutorのパラメータはいったいどういう意味ですか.
スーパーがあるとしたら、お客様が会計するのが任務だと思います.ではmaximumPoolSizeはこのスーパーにレジがいくつあるかを規定しています.corePoolSizeは最初からレジ係が何人いるかを規定しています.レジが足りないときはthreadFactoryから新しいレジが出てきます.お客さんが多くない时、あれらの多く出てきたレジは暇になって、暇な时間がkeepAliveTimeを上回って、その暇なレジは行きました;並んでいる人がworkQueueに並んでいて、workQueueの中に並んでいない人はどうしますか.前に言ったでしょう.レジが足りないときは、threadFactoryから新しいレジが出てきます.レジの数が足りない人はどうすればいいのか、handlerはその人たちを処理します.
だからスーパーが何人サービスできるかというと、レジの数に行列ができる長さ、つまりmaximumPoolSize+workQueueです.size()
ThreadPoolExecutorを学ぶ難しさは、彼の構造方法の各パラメータの意味を理解することだと思います.
では、簡単な例を挙げて、そのまま使い始めました.ThreadPoolExecutorはAbstractExecutorServiceを継承しているので、『AbstractExecutorService』という文章でAbstractExecutorServiceの使い方を話したことがあるので、そのまま使い始めました.
まず感じて、これはどういう意味ですか.まず困惑を解いて、7つのパラメータがあるのではないでしょうか.threadFactoryとhandlerはどこへ行きましたか.threadFactoryはスレッドを作成しました.つまり、新しいレジを作成しました.Javaのソースコードはあなたに実現しました.handlerはスーパーのサービス範囲を超えた人を処理しています.Javaのデフォルトの処理方法は直接異常を投げているので、私たちも自分でどのように処理するかを定義することができます.
さて、上記のコードの意味は、やはり白話文で、このスーパーには最初からレジが2人、レジが5人、最大5人が並んでいて、新しいレジが60秒を超えて仕事をしていないと離れることを定義しています.
そのため、このスーパーは会計エリアで最大10人の顧客を同時に収容することができます.
では、彼に10人のお客様を手配しましょう.
実行結果:
マルチスレッドなので、結果は勝手で、各スレッドは1人のレジ係なので、2人の顧客にサービスしたレジ係がいるのが見えます.
責任を負うために、ここではJDKドキュメントのこれらのパラメータの説明を貼ります.
CorePoolSize-空きスレッドを含むプールに保存されているスレッドの数.maximumPoolSize-プールで許容される最大スレッド数.keepAliveTime-スレッド数がコアより大きい場合、終了前に余分な空きスレッドが新しいタスクを待機する最長時間です.unit-keepAliveTimeパラメータの時間単位.WorkQueue-実行前にタスクを保持するキュー.このキューは、executeメソッドによってコミットされたRunnableタスクのみを保持します.threadFactory-プログラムを実行して新しいスレッドを作成するときに使用するファクトリ.handler-スレッド範囲とキュー容量を超えたため、ブロックされたときに使用されるプロセッサを実行します.
public class ThreadPoolExecutor extends AbstractExecutorService
ここを見て、何か感じがしますか.このクラスはAbstractExecutorServiceを直接継承しています.私は『AbstractExecutorService』という文章でAbstractExecutorServiceについて話したことがあります.皆さんはまだ印象がありますか.AbstractExecutorServiceは抽象的なクラスで、私が前回どのようにこのクラスを説明したか見てみましょう.
AbstraactExecutorServiceの中の方法はこの4つのスタイルです.shutdownはタスクを閉じるTerminatedを表してタスクsubmitを中断してrunnable実行タスクinvokeを提供して実行するタスクを準備して、AbstractExecutorServiceはすでに自主的にsubmitとinvokeのタイプの方法を実現して、つまりタスクの手配を私たちに規定したので、私たちはAbstractExecutoriceサービスというクラスを使用するならば、痛くも痒くもないshutdownやTerminatedタイプを実現する方法だけでいいです.
AbstractExecutorServiceを継承したThreadPoolExecutorを見てみましょう.抽象的ではなく、完璧なクラスです.どんな方法でも書いてくれます.私たちはこのクラスを使うことをマスターすればいいだけです.便利ですね.
まず、ThreadPoolExecutorクラスの構造方法を見てみましょう.構造方法は4つありますが、効果は同じで、パラメータが異なるだけです.しかし、この4つの構造方法には共通の5つのパラメータがあり、それぞれ:
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue
各パラメータの意味をそれぞれ説明する(完全な個人理解、公式解釈ではない):corePoolSize:スレッドプールに既存のスレッド数maximumPoolSize:最大どれだけのタスクを実行するかkeepAliveTime:スレッドなどのタスクをアイドルする時間、古い時間はunitを待たない:時間単一ワークQueue:まだ実行されていないタスクを保存する
以上は4つの构造方法が共有するパラメータですが、次にパラメータが一番多い构造方法の他のパラメータは何ですか.それぞれ以下の2つです.
ThreadFactory threadFactory,
RejectedExecutionHandler handler
これらのパラメータは何をしているのか説明します:threadFactory:スレッドを作成する場所handler:キュー容量を超えるタスクはhandlerで処理します
これらの説明を見ると、必ずしもこれらのパラメータの意味を悟ることができるとは限らないと思います.完全な概念を与えるために、私は類比の方法でこれらのパラメータの意味を感じさせます.
構築方法:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler){
...
}
ThreadPoolExecutorのパラメータはいったいどういう意味ですか.
スーパーがあるとしたら、お客様が会計するのが任務だと思います.ではmaximumPoolSizeはこのスーパーにレジがいくつあるかを規定しています.corePoolSizeは最初からレジ係が何人いるかを規定しています.レジが足りないときはthreadFactoryから新しいレジが出てきます.お客さんが多くない时、あれらの多く出てきたレジは暇になって、暇な时間がkeepAliveTimeを上回って、その暇なレジは行きました;並んでいる人がworkQueueに並んでいて、workQueueの中に並んでいない人はどうしますか.前に言ったでしょう.レジが足りないときは、threadFactoryから新しいレジが出てきます.レジの数が足りない人はどうすればいいのか、handlerはその人たちを処理します.
だからスーパーが何人サービスできるかというと、レジの数に行列ができる長さ、つまりmaximumPoolSize+workQueueです.size()
ThreadPoolExecutorを学ぶ難しさは、彼の構造方法の各パラメータの意味を理解することだと思います.
では、簡単な例を挙げて、そのまま使い始めました.ThreadPoolExecutorはAbstractExecutorServiceを継承しているので、『AbstractExecutorService』という文章でAbstractExecutorServiceの使い方を話したことがあるので、そのまま使い始めました.
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(5));
まず感じて、これはどういう意味ですか.まず困惑を解いて、7つのパラメータがあるのではないでしょうか.threadFactoryとhandlerはどこへ行きましたか.threadFactoryはスレッドを作成しました.つまり、新しいレジを作成しました.Javaのソースコードはあなたに実現しました.handlerはスーパーのサービス範囲を超えた人を処理しています.Javaのデフォルトの処理方法は直接異常を投げているので、私たちも自分でどのように処理するかを定義することができます.
さて、上記のコードの意味は、やはり白話文で、このスーパーには最初からレジが2人、レジが5人、最大5人が並んでいて、新しいレジが60秒を超えて仕事をしていないと離れることを定義しています.
そのため、このスーパーは会計エリアで最大10人の顧客を同時に収容することができます.
では、彼に10人のお客様を手配しましょう.
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(5));
ArrayList> datas = new ArrayList<>();
for (int i = 0; i < 10; i++) {
int finalI = i;
datas.add(new Callable() {
@Override
public String call() throws Exception {
System.out.println(finalI + " \t" + Thread.currentThread().getName());
return finalI + " \t" + Thread.currentThread().getName();
}
});
}
try {
threadPoolExecutor.invokeAll(datas);
} catch (InterruptedException e) {
e.printStackTrace();
}
実行結果:
1 pool-1-thread-2
8 pool-1-thread-4
7 pool-1-thread-3
0 pool-1-thread-1
4 pool-1-thread-3
9 pool-1-thread-5
3 pool-1-thread-4
2 pool-1-thread-2
6 pool-1-thread-5
5 pool-1-thread-3
マルチスレッドなので、結果は勝手で、各スレッドは1人のレジ係なので、2人の顧客にサービスしたレジ係がいるのが見えます.
責任を負うために、ここではJDKドキュメントのこれらのパラメータの説明を貼ります.
CorePoolSize-空きスレッドを含むプールに保存されているスレッドの数.maximumPoolSize-プールで許容される最大スレッド数.keepAliveTime-スレッド数がコアより大きい場合、終了前に余分な空きスレッドが新しいタスクを待機する最長時間です.unit-keepAliveTimeパラメータの時間単位.WorkQueue-実行前にタスクを保持するキュー.このキューは、executeメソッドによってコミットされたRunnableタスクのみを保持します.threadFactory-プログラムを実行して新しいスレッドを作成するときに使用するファクトリ.handler-スレッド範囲とキュー容量を超えたため、ブロックされたときに使用されるプロセッサを実行します.