Timer类负责管理延迟任务以及周期任务。然而,Timer存在一些固有的缺陷。
Timer 在执行定时任务时只会创建一个后台线程。如果某个线程执行的时间过长,那么将破会其他定时任务的精确性。
Timer的另一个问题是,如果TimerTask抛出一个非检查异常,由于Timer不捕获异常导致终止定时任务线程。在这样情况下,Timer无法恢复线程的执行,而是错误地认为整个Timer都被取消了。因此,已经被调度但尚未执行的TimerTask将不会再被执行,新的任务也不能被调度。
Timer支持基于绝对时间而不是相对时间的调度机制,因此任务的执行对系统时间的变化很敏感。
ScheduledThreadPoolExecutor在调度多个定时任务时要好于Timer。
ScheduledThreadPoolExecutor 只支持相对时间的调度。
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
/**
*
* @author zhangwei_david
* @version $Id: Ten.java, v 0.1 2014年11月12日 下午3:30:39 zhangwei_david Exp $
*/
public class Newline extends TimerTask {
/**
* @see java.util.TimerTask#run()
*/
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
}
System.out.println("\r\n");
}
}
import java.util.TimerTask;
/**
*
* @author zhangwei_david
* @version $Id: One.java, v 0.1 2014年11月12日 下午3:29:31 zhangwei_david Exp $
*/
public class print extends TimerTask {
/**
* @see java.util.TimerTask#run()
*/
@Override
public void run() {
System.out.print("-");
}
}
import java.util.TimerTask;
/**
*
* @author zhangwei_david
* @version $Id: Stop.java, v 0.1 2014年11月12日 下午4:16:50 zhangwei_david Exp $
*/
public class Stop extends TimerTask {
/**
* @see java.util.TimerTask#run()
*/
@Override
public void run() {
throw new RuntimeException("运行异常");
}
}
import java.util.Date;
import java.util.Timer;
import java.util.concurrent.TimeUnit;
/**
*
* @author zhangwei_david
* @version $Id: TimerClient.java, v 0.1 2014年11月12日 下午3:31:00 zhangwei_david Exp $
*/
public class TimerClient {
public static void main(String[] args) {
Timer timer = new Timer();
Date d = new Date();
timer.schedule(new print(), d, TimeUnit.SECONDS.toMillis(2));
timer.schedule(new Newline(), d, TimeUnit.SECONDS.toMillis(4));
timer.schedule(new Stop(), TimeUnit.MINUTES.toMillis(1));
}
}
执行结果是:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Exception in thread "Timer-0" java.lang.RuntimeException: 运行异常
at com.cathy.demo.concurrency.schedule.Stop.run(Stop.java:21)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
*
* @author zhangwei_david
* @version $Id: ScheduledThreadClient.java, v 0.1 2014年11月12日 下午3:47:37 zhangwei_david Exp $
*/
public class ScheduledThreadClient {
/**
*
* @param args
*/
public static void main(String[] args) {
ScheduledExecutorService ses = new ScheduledThreadPoolExecutor(10);
ses.scheduleAtFixedRate(new print(), 0, 2, TimeUnit.SECONDS);
ses.scheduleAtFixedRate(new Newline(), 2, 4, TimeUnit.SECONDS);
ses.scheduleWithFixedDelay(new Stop(), 1, 1, TimeUnit.MILLISECONDS);
}
}
结果是:
---
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-