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つのスレッドしか実行されない可能性があります