最近有同事提出在项目中使用JDK自带的定时器,之前的任务调度一直使用的是Quartz,对Timer没有研究过。因此研究了下如何使用Timer。
- 每一个Timer会启动一个线程(TimerThread),如下代码将产生5个定时器线程
import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { for (int i = 0; i < 5; i++) { Timer timer = new Timer(); timer.schedule(new MyTask(i), 10000); } } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { System.out.println(i); } }
- 每一个Timer可以添加多个TimerTask
import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { Timer timer = new Timer(); for (int i = 0; i < 5; i++) { timer.schedule(new MyTask(i), 10000); } } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { System.out.println(i); } }
- TimerTask会被放入一个有优先级的队列(TimerQueue)中
import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { Timer timer = new Timer(); for (int i = 0; i < 5; i++) { timer.schedule(new MyTask(i), (10-i)*1000); } } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { System.out.println(i); } }
- Timer和TimerTask都是可以被取消的
- 在同一个TimerQueue中,如果前一个TimerTask没有执行完,那么下一个TimerTask是不会被执行的
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { Timer timer = new Timer(); for (int i = 0; i < 5; i++) { timer.schedule(new MyTask(i), (10-i)*1000); } } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { // try { // Thread.sleep(i * 1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } System.out.println(i + ":" +new Date()); } }
正常的结果,输出相差1秒4:Sun Jan 20 22:55:17 CST 2013 3:Sun Jan 20 22:55:18 CST 2013 2:Sun Jan 20 22:55:19 CST 2013 1:Sun Jan 20 22:55:20 CST 2013 0:Sun Jan 20 22:55:21 CST 2013
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { Timer timer = new Timer(); for (int i = 0; i < 5; i++) { timer.schedule(new MyTask(i), (10-i)*1000); } } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { try { Thread.sleep(i * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i + ":" +new Date()); } }
第一个任务的延迟使之后所有任务都延迟4:Sun Jan 20 22:57:08 CST 2013 3:Sun Jan 20 22:57:11 CST 2013 2:Sun Jan 20 22:57:13 CST 2013 1:Sun Jan 20 22:57:14 CST 2013 0:Sun Jan 20 22:57:14 CST 2013
- schedule(TimerTask task, Date time):在指定时间执行任务,如果指定的时间比早于当前时间,则马上执行
- schedule(TimerTask task, long delay):延迟delay毫秒之后执行任务
- scheduleAtFixedRate和schedule的区别
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerTestCase { public static void main(String[] args) throws Exception { Timer timer = new Timer(); System.out.println(new Date()); timer.schedule(new MyTask(0), 1000, 2000); timer.scheduleAtFixedRate(new MyTask(1), 1000, 2000); } } class MyTask extends TimerTask { private int i; public MyTask(int i){ this.i = i; } @Override public void run() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i + ":" +new Date()); } }
结果如下,scheduleAtFixedRate无论在什么情况下都已固定频率执行,而schedule则可能延迟Sun Jan 20 23:06:49 CST 2013 0:Sun Jan 20 23:06:53 CST 2013 1:Sun Jan 20 23:06:56 CST 2013 1:Sun Jan 20 23:06:59 CST 2013 0:Sun Jan 20 23:07:02 CST 2013 1:Sun Jan 20 23:07:05 CST 2013 1:Sun Jan 20 23:07:08 CST 2013 1:Sun Jan 20 23:07:11 CST 2013 1:Sun Jan 20 23:07:14 CST 2013 0:Sun Jan 20 23:07:17 CST 2013
Timer的缺陷:
- Timer是基于绝对时间的,因此任务的执行对系统时间变化很敏感
- 如果TimerTask执行时间过长,会破坏其他TimerTask的定时精确性
- 如果TimerTask抛出一个未受检查的异常,Timer线程并不捕获,线程将被终止,尚未执行的TimerTask将不会再执行
在Java 5.0或者更高的版本中,可以使用ScheduledThreadPoolExecutor代替Timer。
相关推荐
JAVA定时器,只要服务开启,就能指定某些代码在某个时刻执行,例如:监狱里罪犯的余刑天数,每天都要减少,就可以设置一个定时器在每天的23:59:59来执行减少余刑天数的天。
讲解Java定时器开发
实例助解java定时器设置及停止的方法
Java定时器的使用 Java程序 Java写的一个定时器
java定时器,import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; 规定每天几点执行一次
java定时器
JAVA定时器JAVA定时器.pdf
java 定时器(Timer) java 定时器(Timer) java 定时器(Timer)
在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。 对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。
Java定时器简例
java定时器,timer类操作详解 java定时器,timer类操作详解
spring定时器代码。解决多次执行问题。包含quartz-all.jar包。 说明很详细。希望能帮上哪位朋友。
3.JAVA 定时器及SqlServer和Oracle封装链接数据库,增/删/改/查可直接使用(提供JAR) 4.从JDK的安装到最后定时器发布成功,都有非常详细的操作说明及截图,新手按照操作说明及截图,很快可以掌握原理,在此基础上...
java定时器例子,使用 java.util.TimerTask 类来实现定时执行
java定时器
有助于你快速的查找您要使用的类对象及其方法。
java定时器 spring定时器:包括spring定时器的详细配置以及说明 包含所需的jar包
Java定时器.pdf
比较全面的定时器,里面有例子,照着例子就可以学会spring和java定时器。