Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。
任务的调用通过起的子线程进行执行。
java.util.Timer
java.util.TimerTask
一、调用方法:
(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务
(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务
(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。
(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。
(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。
(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。
void java.util.Timer.cancel():终止该Timer
boolean java.util.TimerTask.cancel():终止该TimerTask
可以为每个Timer指定多个TimerTask
虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。
对于该种需求,可通过Quartz来进行实现
二、方法名称schedule()和scheduleAtFixedRate()两者的区别
当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。
调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。
<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period
三、示例
(1)
/** * 第一种方法:设定多长时间(毫秒)后执行任务 */ public static void timer1() { final StopWatch watch = new StopWatch(); watch.start(); Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, long delay) */ timer.schedule(new TimerTask() { public void run() { watch.stop(); System.out.println("-------任务执行--------"); System.out.println(watch.getTime()); } }, 2000);// delay=2000毫秒 后执行该任务 }
(2)
/** * 第二种方法:设定某个时间执行任务 */ public static void timer2() { Calendar calendar = new GregorianCalendar(); calendar.add(Calendar.MINUTE, 1); calendar.set(Calendar.SECOND, 0); // 一分钟后执行 Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, Date time) */ timer.schedule(new TimerTask() { @Override public void run() { System.out.println("-------任务执行--------"); } }, calendar.getTime()); }
(3)
/** * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行 */ public static void timer3() { Timer timer = new Timer(); final StopWatch watch = new StopWatch(); watch.start(); System.out.println(Thread.currentThread().getName()); /* * void java.util.Timer.schedule(TimerTask task, long delay, long * period) */ timer.schedule(new TimerTask() { public void run() { /* 子线程进行任务的执行 */ System.out.println(Thread.currentThread().getName()); System.out.println("-------设定要指定任务--------"); watch.suspend(); System.out.println(watch.getTime()); watch.reset(); watch.start(); } }, 1000, 1000); }
(4)
/** * 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。 * 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。 * 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行 */ public static void timer3a() { Timer timer = new Timer(); final StopWatch watch = new StopWatch(); watch.start(); timer.schedule(new TimerTask() { Integer i = 1; public void run() { System.out.println(watch.getTime()); System.out.println("########第" + i + "次执行开始########"); try { Thread.sleep(400); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("########第" + i + "次执行结束########"); i++; watch.reset(); watch.start(); } }, 1000, 500); }
period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒
打印日志信息:
- 1000
- ########第1次执行开始########
- ########第1次执行结束########
- 109
- ########第2次执行开始########
- ########第2次执行结束########
- 93
- ########第3次执行开始########
- ########第3次执行结束########
- 93
- ########第4次执行开始########
- ########第4次执行结束########
- 93
- ########第5次执行开始########
- ########第5次执行结束########
- 93
- ########第6次执行开始########
- ########第6次执行结束########
- 93
- ########第7次执行开始########
- ########第7次执行结束########
- 93
- ########第8次执行开始########
当将Thread.sleep(400);修改为Thread.sleep(600)时:
打印日志信息:
- 1000
- ########第1次执行开始########
- ########第1次执行结束########
- 0
- ########第2次执行开始########
- ########第2次执行结束########
- 0
- ########第3次执行开始########
- ########第3次执行结束########
- 0
- ########第4次执行开始########
- ########第4次执行结束########
- 0
- ########第5次执行开始########
(5)
/** * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 * 每天中午12点都执行一次 */ public static void timer4() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时 calendar.set(Calendar.MINUTE, 0); // 控制分 calendar.set(Calendar.SECOND, 0); // 控制秒 Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00 Timer timer = new Timer(); /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */ timer.schedule(new TimerTask() { public void run() { System.out.println("-------设定要指定任务--------"); } }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行 }
(6)
/** * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。 * timer.schedule和timer.scheduleAtFixedRate的区别: * (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次 * (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period */ public static void timer5() { Timer timer = new Timer(); /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */ timer.scheduleAtFixedRate(new TimerTask() { public void run() { System.out.println("-------设定要指定任务--------"); } }, 1000, 500); }
转:http://blog.csdn.net/eg366/article/details/11836017