Timer为JDK自带的任务调度工具类。
结构简单易用,功能也比较有限,而且容易出现误差。
1.结构简介
Timer:任务调度器
TimerTask:任务接口,所有被Timer调度的任务都需实现此接口
2.实例
/**
* TimerTest.java
* Create by Administrator at 10:29:18 PM
*/
package com.siyuan.timer;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author Administrator
* @Description
*/
public class TimerTest {
/**
* TimerTask第一次执行时间与被调度之间的间隔
*/
public static final int DELAY = 1000 * 10;
/**
* TimerTask循环执行之间的时间间隔10s
*/
public static final int PERIOD_BETWEEN_LOOP = 1000 * 10;
/**
*
* @author Administrator
* @Description
*/
public static class TimerTaskImpl extends TimerTask {
@Override
public void run() {
System.out.println(new Date());
}
}
/**
* @param args
*/
public static void main(String[] args) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.MINUTE, 50);
calendar.set(Calendar.SECOND, 0);
Date startTime = calendar.getTime();
TimerTask task = new TimerTaskImpl();
Timer timer = new Timer();
//测试时需要逐一测试,否则会出错
//java.lang.IllegalStateException: Task already scheduled or cancelled
//执行一次,startTime在当前时间之前则马上执行
//timer.schedule(task, startTime);
//执行一次
//timer.schedule(task, DELAY);
//startTime时间在当前时间之后,
//则从startTime开始循环执行,即使某个时间间隔中由于某种问题间隔时间>10S,下一次间隔时间也仍为10S
//Sat Mar 19 22:50:00 CST 2011
//Sat Mar 19 22:50:11 CST 2011
//Sat Mar 19 22:50:21 CST 2011
//startTime时间在当前时间之前,
//则从当前时间开始循环执行N次
//Sat Mar 19 22:57:53 CST 2011
//Sat Mar 19 22:58:04 CST 2011
//Sat Mar 19 22:58:14 CST 2011
//timer.schedule(task, startTime, PERIOD_BETWEEN_LOOP);
//从被调度的时间开始计时,DELAY之后第一次执行,之后每隔PERIOD_BETWEEN_LOOP执行一次
//对时间间隔超时的处理方式与上一方法一致
//timer.schedule(task, DELAY, PERIOD_BETWEEN_LOOP);
//startTime时间在当前时间之后,
//则从startTime开始循环执行,如果某个时间间隔中由于某种问题间隔时间>10S,下一次间隔时间则会<10s,从而使频率不变
//startTime时间在当前时间之前,
//则立即执行(currentTime-startTime) / PERIOD_BETWEEN_LOOP + 1次,然后以上述方式进行循环
timer.scheduleAtFixedRate(task, startTime, PERIOD_BETWEEN_LOOP);
//从被调度的时间开始计时,DELAY之后第一次执行,之后每隔PERIOD_BETWEEN_LOOP执行一次
//对时间间隔超时的处理方式与上一方法一致
//timer.scheduleAtFixedRate(task, DELAY, PERIOD_BETWEEN_LOOP);
}
}
3.参考资料
JDK