Timer&ScheduledThreadPoolExecutorの違い
1668 ワード
package com.famous.thread.TimerExample;
import java.util.Timer;
import java.util.TimerTask;
public class TimerClient {
public static void main(String[] args) {
Timer timer = new Timer(" ");
Timer timer2 = new Timer(true);
timer2.schedule(new TimerTask() {
@Override
public void run() {
System.err.println(" 2000ms ");
try {
Thread.sleep(4000);
System.err.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 2000, 2000);
timer2.schedule(new TimerTask() {
int i = 0;
@Override
public void run() {
System.err.println("two");
i++;
if (i > 3) {
throw new RuntimeException();
}
}
}, 2000, 2000);
}
}
a.Timerは絶対時間に基づいている.システムクロックの影響を受けやすい.b.TimerはすべてのTimeTaskを実行するために1つのスレッドだけを新規に作成した.すべてのTimeTaskは、c.TimerがTimerTaskの異常をキャプチャすることなく、単純に停止することに関連する可能性がある.これは他のTimeTaskの実行に影響を与えるに違いない.
主:1:Timerはスレッドを1つだけ作成しました.タスクの実行時間が設定された遅延時間を超えると、いくつかの問題が発生します.
package com.famous.thread.TimerExample;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExecutorClient {
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(
3);
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.err.println(11);
}
}, 1, 1, TimeUnit.SECONDS);
}
}
新FixedThreadPoolと
Semaphore
違い:
NewFixedThredPool制御スレッドは実行される個数ですが、Semaphoreはリソースの寄与変数へのアクセスを制御するだけです.例えば
newCachedThreadPool
スレッドは、Semaphore制御が必要なコードの場所まで実行される可能性があります.ただしFixedを使用します.3つのスレッドしか実行されない可能性があります