??? 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); } }
?结果是:
--- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
?
?
?
ScheduledThreadPoolExecutor与Timer
原文:http://zhangwei-david.iteye.com/blog/2155043