在Timer和ScheduledExecutorService以及 clockManager之间的选择
2014-12-29 11:18
295 查看
摘自刘亚超老师的PPT.
//在Timer和ScheduledExecutorService以及 clockManager之间的选择
// 还有更好的方法 :延时handler 就可以实现循环的效果
/*
quartzWeb框架threadJDK
java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。
但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,
由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。
Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。
这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。
*/
//测试Timer的例子
/*
运行该程序,Timer会抛出一个RumtimeException和java.lang.IllegalStateException:Timer already cancelled.
常言道,真是祸不单行,Timer还将它的问题传染给下一个倒霉的调用者,这个调用者原本试图提交一个TimerTask的,
你可能希望程序会一直运行下去,然而实际情况如程序所示5秒钟后就中止了,还伴随着一个异常,
异常的消息是"Timer already cancelled"。ScheduledThreadPoolExector妥善地处理了这个异常的任务,所以说在java5.0或更高的JDK中,几乎没有理由再使用Timer了。
用ScheduledThreadPoolExector改进后的例子
*/
//用一个定时器 来完成图片切换
//Timer 与 ScheduledExecutorService 实现定时器的效果
//在Timer和ScheduledExecutorService以及 clockManager之间的选择
// 还有更好的方法 :延时handler 就可以实现循环的效果
/*
quartzWeb框架threadJDK
java.util.Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。
但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,
由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。
Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。
Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。
这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。
*/
//测试Timer的例子
//Java代码 package com.bill99.test; import java.util.Timer; import java.util.TimerTask; public class TimerTest { private Timer timer = new Timer(); //启动计时器 public void lanuchTimer(){ timer.schedule(new TimerTask(){ public void run() { throw new RuntimeException(); } }, 1000*3, 500); } //向计时器添加一个任务 public void addOneTask(){ timer.schedule(new TimerTask(){ public void run(){ System.out.println("hello world"); } }, 1000*1,1000*5); } public static void main(String[] args) throws Exception { TimerTest test = new TimerTest(); test.lanuchTimer(); Thread.sleep(1000*5);//5秒钟之后添加一个新任务 test.addOneTask(); } }
/*
运行该程序,Timer会抛出一个RumtimeException和java.lang.IllegalStateException:Timer already cancelled.
常言道,真是祸不单行,Timer还将它的问题传染给下一个倒霉的调用者,这个调用者原本试图提交一个TimerTask的,
你可能希望程序会一直运行下去,然而实际情况如程序所示5秒钟后就中止了,还伴随着一个异常,
异常的消息是"Timer already cancelled"。ScheduledThreadPoolExector妥善地处理了这个异常的任务,所以说在java5.0或更高的JDK中,几乎没有理由再使用Timer了。
用ScheduledThreadPoolExector改进后的例子
*/
//Java代码 package com.bill99.test; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledExecutorTest { //线程池能按时间计划来执行任务,允许用户设定计划执行任务的时间,int类型的参数是设定 //线程池中线程的最小数目。当任务较多时,线程池可能会自动创建更多的工作线程来执行任务 public ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1); //启动计时器 public void lanuchTimer(){ Runnable task = new Runnable() { public void run() { throw new RuntimeException(); } }; scheduExec.scheduleWithFixedDelay(task, 1000*5, 1000*10, TimeUnit.MILLISECONDS); } //添加新任务 public void addOneTask(){ Runnable task = new Runnable() { public void run() { System.out.println("welcome to china"); } }; scheduExec.scheduleWithFixedDelay(task, 1000*1, 1000, TimeUnit.MILLISECONDS); } public static void main(String[] args) throws Exception { ScheduledExecutorTest test = new ScheduledExecutorTest(); test.lanuchTimer(); Thread.sleep(1000*5);//5秒钟之后添加新任务 test.addOneTask(); } }
//用一个定时器 来完成图片切换
//Timer 与 ScheduledExecutorService 实现定时器的效果
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); //通过定时器 来完成 每2秒钟切换一个图片 //经过指定的时间后,执行所指定的任务 //scheduleAtFixedRate(command, initialDelay, period, unit) //command 所要执行的任务 //initialDelay 第一次启动时 延迟启动时间 //period 每间隔多次时间来重新启动任务 //unit 时间单位 scheduledExecutorService.scheduleAtFixedRate(new ViewPagerTask(), 1, 2, TimeUnit.SECONDS);
相关文章推荐
- Timer与ScheduledExecutorService间的选择
- Jdk自带的定时任务TimerTask和ScheduledExecutorService及其在Spring中的集成
- Timer和ScheduledExecutorService
- Timer与ScheduledExecutorService间的抉择
- Timer的缺陷 用ScheduledExecutorService替代
- 在Timer和ScheduledExecutorService间决择
- Timer与ScheduledExecutorService
- Java中 Timer缺陷,用ScheduledExecutorService替代
- Timer与ScheduledExecutorService间的抉择
- Timer与ScheduledExecutorService 的使用和区别
- 在Timer和ScheduledExecutorService间决择
- ScheduledExecutorService和timer的异同
- Timer与ScheduledExecutorService间的抉择
- 使用 ScheduledExecutorService 来替换 Timer
- Timer与ScheduledExecutorService间的抉择
- Timer与ScheduledExecutorService的使用和区别
- ScheduledExecutorService和timer的异同
- 使用 ScheduledExecutorService 来替换 Timer。
- timer与ScheduledExecutorService
- Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代