4種類のExcutorSerivce
4475 ワード
new threadとの違いについては、延長しません.利点:(copyネット上の解釈)a.存在するスレッドを再利用し、オブジェクトの作成、消滅のオーバーヘッドを低減し、性能が良い.b.最大同時スレッド数を効果的に制御し、システム資源の使用率を高めると同時に、多すぎる資源競争を避け、渋滞を避けることができる.c.タイミング実行、定期実行、単一スレッド、同時数制御などの機能を提供する.4種類のExcutorServices:newCachedThreadPoolはキャッシュ可能なスレッドプールを作成し、スレッドプールの長さが処理の必要以上であれば、空きスレッドを柔軟に回収し、回収できない場合は新しいスレッドを作成します.新FixedThreadPoolは、スレッドの最大同時数を制御し、超過したスレッドがキュー内で待機する定長スレッドプールを作成します.新ScheduledThreadPoolは、タイミングおよび周期的なタスク実行をサポートする定長スレッドプールを作成します.新SingleThreadExecutorは、一意の作業スレッドのみでタスクを実行し、すべてのタスクが指定された順序(FIFO、LIFO、優先度)で実行されることを保証する単一スレッド化されたスレッドプールを作成します.
1、newCachedThreadPoolは無限スレッドプールサイズのスレッドプールとして理解する
無限スレッドプールのサイズである以上、なぜ直接new 1つのThreadを使用しないのか、スレッドプールを使用して空きスレッドを回収することができ、回収可能な状況がない場合、新しいスレッドを作成するので、毎回直接new 1つのThreadに比べて、新しいスレッドの消費時間を減らし、リソースの利用性を増加させることができる.(単純Sysoutの10万個のスレッドをプライベートでテストしたが,時間は2400 ms:460 ms)2,newFixedThreadPool定長のスレッドプール,スレッド数が超過した場合,待機する.これはよく理解できて、説明しません.
3、newSingleThreadExecutor単一スレッドのスレッドプール.newFixedThreadPool(1)と同様に、一般的なシーンでは、特定の順序でタスクを実行するために使用されます.
4、newScheduledThreadPool、定長ラインプール、タイミングと周期的な任務をサポートする.
scheduleAtFixedRate(task,delay,period,timeUtil):前のタスクから実行を開始した後、periodサイクル後に次のタスクを実行しますが、前のタスクが完了していない場合は、前のタスクが先にscheduleWithFixedDelay(task,dalay,period,timeUtil):前のタスク終了後、p'eriodサイクルから次のタスクschedule(task,period,timeUtil):period秒後に実行を開始します.
新ScheduledThreadPoolとTimerはjdk 1から少し似ていると思いますか?5以降、Timerの代わりにnewScheduledThreadPoolを使用することをお勧めします.機能は似ていますが、安定性などの面ではtimerより高いからです.
1、newCachedThreadPoolは無限スレッドプールサイズのスレッドプールとして理解する
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
無限スレッドプールのサイズである以上、なぜ直接new 1つのThreadを使用しないのか、スレッドプールを使用して空きスレッドを回収することができ、回収可能な状況がない場合、新しいスレッドを作成するので、毎回直接new 1つのThreadに比べて、新しいスレッドの消費時間を減らし、リソースの利用性を増加させることができる.(単純Sysoutの10万個のスレッドをプライベートでテストしたが,時間は2400 ms:460 ms)2,newFixedThreadPool定長のスレッドプール,スレッド数が超過した場合,待機する.これはよく理解できて、説明しません.
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
3、newSingleThreadExecutor単一スレッドのスレッドプール.newFixedThreadPool(1)と同様に、一般的なシーンでは、特定の順序でタスクを実行するために使用されます.
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
4、newScheduledThreadPool、定長ラインプール、タイミングと周期的な任務をサポートする.
scheduleAtFixedRate(task,delay,period,timeUtil):前のタスクから実行を開始した後、periodサイクル後に次のタスクを実行しますが、前のタスクが完了していない場合は、前のタスクが先にscheduleWithFixedDelay(task,dalay,period,timeUtil):前のタスク終了後、p'eriodサイクルから次のタスクschedule(task,period,timeUtil):period秒後に実行を開始します.
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
executorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("yes");
}
}, 3, TimeUnit.SECONDS);
// ,3 , ,
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("Atfixed");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 1, 3, TimeUnit.SECONDS);
// ,3
executorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("fixed");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 1, 3, TimeUnit.SECONDS);
新ScheduledThreadPoolとTimerはjdk 1から少し似ていると思いますか?5以降、Timerの代わりにnewScheduledThreadPoolを使用することをお勧めします.機能は似ていますが、安定性などの面ではtimerより高いからです.