スレッドプールの紹介とその管理
6455 ワード
スレッド・プールの最下位でブロッキング・キューBlockingQueueを使用
同時キュー非ブロックキューConcurrentLinkedQueue(poll peek)ブロックキューBlockingQueue(ArrayBlockingQueue offer)
ブロックキューと非ブロックキュー
ブロッキングキューは、生産者と消費者のシーン生産者によく使用されます.->キュー->消費者がブロッキングされる場合は、主に次の2つがあります.キューがいっぱいになったときにエンキュー動作 を行う.キューが空であるときにデキュー動作 を行う.
列に入ると、キューがいっぱいになると、ブロックされていないキューで、キュー情報が失われます.キューをブロックし、待機します.列が出ると、キューが空の場合:非ブロックキュー、nullブロックキューに戻り、待機します.
キューをブロックするスレッド
非ブロックキュー
Javaのスレッドプールシーンと利点Javaのスレッドプールシーン:シーンが最も多い同時フレームワークを運用し、非同期または同時実行タスクを必要とするほとんどのプログラム;(例:ドメイン名スキャン管理)メリット:第一に、リソース消費を削減します.作成したスレッドを再利用することで、スレッドの作成と破棄による消費量を削減します.第二に、応答速度を向上させる.タスクが到着すると、タスクはスレッドの作成まで待たずにすぐに3つ目を実行できます.スレッドの管理性を向上させます.スレッドは希少なリソースであり、無制限に作成すると、システムリソースが消費されるだけでなく、システムの安定性が低下し、スレッドプールを使用して統一的な割り当て、チューニング、監視が可能になります.しかし,スレッドプールを合理的に利用するには,その実現原理を手のひらで知らなければならない.
スレッドプールの役割スレッドプールは、突然大量に爆発するスレッドのために設計され、限られたいくつかの固定スレッドが大量の操作サービスを提供することで、スレッドの作成と破棄に要する時間を短縮し、効率を向上させる.
1つのスレッドの時間が非常に長い場合は、スレッドプールを使用する必要はありません(長時間操作できないのではなく、適切ではありません).さらに、スレッドプール内のスレッドの開始、停止、中止を制御することはできません.
スレッドプールの分類
Executorフレームワークの最上位実装は、ThreadPoolExecutorクラスExecutorsファクトリクラスで提供されるnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPoolメソッドも、実はThreadPoolExecutorのコンストラクタパラメータが異なるだけです
ThreadPoolExecutorスレッドプールの説明:
1.corePoolSize:スレッドプールのコアスレッド数です.デフォルトでは、コアスレッドはアイドル状態であってもオンラインスレッドプールで生存します.2.maximumPoolSize:スレッドプールに収容できる最大スレッド数.アクティブなスレッドがこの数値に達すると、後続の新しいタスクがブロックされます.3.keepAliveTime非コアスレッドアイドル時のタイムアウト時間が長く、それを超えると非コアスレッドが回収されます.4.unit keepAliveTimeパラメータの時間単位.5.workQueue:実行前にタスクを保持するためのキュー.このキューは、executeメソッドによってコミットされたRunnableタスクのみを保持します.
スレッドプールの4つの作成方法は、newCachedThreadPoolがキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要性を超えた場合、空きスレッドを柔軟に回収でき、回収できない場合は新しいスレッドを作成する4つのスレッドプールを提供します.ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
新FixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.
新ScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.
新SingleThreadExecutorは、一意の作業スレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で実行されることを保証する単一スレッド化されたスレッドプールを作成します.
同時キュー非ブロックキューConcurrentLinkedQueue(poll peek)ブロックキューBlockingQueue(ArrayBlockingQueue offer)
ブロックキューと非ブロックキュー
ブロッキングキューは、生産者と消費者のシーン生産者によく使用されます.->キュー->消費者がブロッキングされる場合は、主に次の2つがあります.
列に入ると、キューがいっぱいになると、ブロックされていないキューで、キュー情報が失われます.キューをブロックし、待機します.列が出ると、キューが空の場合:非ブロックキュー、nullブロックキューに戻り、待機します.
public static void main(String[] args) throws InterruptedException {
// 3
ArrayBlockingQueue abQueue = new ArrayBlockingQueue(3);
//
System.out.println(" ");
abQueue.offer("student1");
abQueue.offer("student2");
abQueue.offer("student3");
abQueue.offer("student4",3,TimeUnit.SECONDS);
System.out.println(" ");
//
System.out.println(" ");
System.out.println(" "+abQueue.size());
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll());
System.out.println(" ");
キューをブロックするスレッド
public class ArrayBlockQueueThread {
// 3
public static ArrayBlockingQueue abQueue= new ArrayBlockingQueue(3);
public static void main(String[] args) {
Thread t1 = new Thread(()->{
try {
System.out.println(" ");
abQueue.offer("student1");
abQueue.offer("student2",3,TimeUnit.SECONDS);
abQueue.offer("student3",3,TimeUnit.SECONDS);
// , 3
abQueue.offer("student4",3,TimeUnit.SECONDS);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(" ");
});
t1.start();
//
Thread t2 = new Thread(()->{
try {
Thread.currentThread().sleep(2000L);//2
System.out.println(" ");
System.out.println(" :"+abQueue.size());
System.out.println(" :"+abQueue.poll());// student1
// 4
Thread.currentThread().sleep(2000L);//2
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll());
System.out.println(" :"+abQueue.poll(3,TimeUnit.SECONDS));//
System.out.println(" ");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
t2.start();
}
}
非ブロックキュー
public class ConcurrentLinkedQueueTest2 {
public static void main(String[] args) {
//
ConcurrentLinkedQueue linkedQueue = new ConcurrentLinkedQueue();
// 3
linkedQueue.offer("student1");
linkedQueue.offer("student2");
linkedQueue.offer("student3");
System.out.println(" :"+linkedQueue.size());
// ( )
System.out.println("peek :"+linkedQueue.peek());
System.out.println(" :"+linkedQueue.size());
System.out.println("poll :"+linkedQueue.poll());
System.out.println(" :"+linkedQueue.size());
}
}
Javaのスレッドプールシーンと利点Javaのスレッドプールシーン:シーンが最も多い同時フレームワークを運用し、非同期または同時実行タスクを必要とするほとんどのプログラム;(例:ドメイン名スキャン管理)メリット:第一に、リソース消費を削減します.作成したスレッドを再利用することで、スレッドの作成と破棄による消費量を削減します.第二に、応答速度を向上させる.タスクが到着すると、タスクはスレッドの作成まで待たずにすぐに3つ目を実行できます.スレッドの管理性を向上させます.スレッドは希少なリソースであり、無制限に作成すると、システムリソースが消費されるだけでなく、システムの安定性が低下し、スレッドプールを使用して統一的な割り当て、チューニング、監視が可能になります.しかし,スレッドプールを合理的に利用するには,その実現原理を手のひらで知らなければならない.
スレッドプールの役割スレッドプールは、突然大量に爆発するスレッドのために設計され、限られたいくつかの固定スレッドが大量の操作サービスを提供することで、スレッドの作成と破棄に要する時間を短縮し、効率を向上させる.
1つのスレッドの時間が非常に長い場合は、スレッドプールを使用する必要はありません(長時間操作できないのではなく、適切ではありません).さらに、スレッドプール内のスレッドの開始、停止、中止を制御することはできません.
スレッドプールの分類
Executorフレームワークの最上位実装は、ThreadPoolExecutorクラスExecutorsファクトリクラスで提供されるnewScheduledThreadPool、newFixedThreadPool、newCachedThreadPoolメソッドも、実はThreadPoolExecutorのコンストラクタパラメータが異なるだけです
ThreadPoolExecutorスレッドプールの説明:
1.corePoolSize:スレッドプールのコアスレッド数です.デフォルトでは、コアスレッドはアイドル状態であってもオンラインスレッドプールで生存します.2.maximumPoolSize:スレッドプールに収容できる最大スレッド数.アクティブなスレッドがこの数値に達すると、後続の新しいタスクがブロックされます.3.keepAliveTime非コアスレッドアイドル時のタイムアウト時間が長く、それを超えると非コアスレッドが回収されます.4.unit keepAliveTimeパラメータの時間単位.5.workQueue:実行前にタスクを保持するためのキュー.このキューは、executeメソッドによってコミットされたRunnableタスクのみを保持します.
スレッドプールの4つの作成方法は、newCachedThreadPoolがキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要性を超えた場合、空きスレッドを柔軟に回収でき、回収できない場合は新しいスレッドを作成する4つのスレッドプールを提供します.ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
新FixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.
新ScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.
新SingleThreadExecutorは、一意の作業スレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で実行されることを保証する単一スレッド化されたスレッドプールを作成します.
public class CachePools {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
for(int i =0;i<20;i++){
final int temp=i;//
es.submit(()->{
System.out.println(Thread.currentThread().getName()+" :"+temp);
});
}
es.shutdown();
}
}
public class FixedPools {
public static void main(String[] args) {
// , 4
ExecutorService es = Executors.newFixedThreadPool(4);
for(int i=0;i<10;i++){
final int temp=i;
es.submit(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"task no"+temp);
}
});
}
es.shutdown();
}
}
public class SchedulePools {
public static void main(String[] args) {
ScheduledExecutorService ScheduledEs = Executors.newScheduledThreadPool(3);
SchedulePools x = new SchedulePools();
MyRun r = x.new MyRun();
System.out.println(" :");
ScheduledEs.scheduleAtFixedRate(r, 2, 2, TimeUnit.SECONDS);
}
public class MyRun implements Runnable{
@Override
public void run() {
System.out.println(" ");
}
}
public class SingleThreadPools {
public static void main(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
for(int i=0; i<100;i++){
final int temp=i;
es.submit(new Runnable(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" ");
}
});
}
}
}