Timer用来做定时器的。里面有2个重要的变量 TaskQueue queue = new TaskQueue();这个用来管理任务的,TimerThread thread = new TimerThread(queue);这个用来处理任务,TimerThread 继承了Thread所以是一个线程。
TimerTask定时任务继承Runnable类,所以要实现run方法。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class StuedntTimerTask {
static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
static int i =8;
static Timer timer = null;
public static void main(String[] args) {
TimerTask timeTask = new TimerTask() {
@Override
public void run() {
Date date = new Date();
System.out.println(Thread.currentThread()+"1我被执行了"+sim.format(date));
try {
i--;
if(i < 0){
i =1;
}
Thread.sleep(i*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
timer = new Timer();
Date date = new Date();
System.out.println(sim.format(date));
timer.schedule(timeTask, new Date(),3000);
//timer.scheduleAtFixedRate(timeTask, new Date(),3000);
}
}
timer.schedule(timeTask, new Date(),3000);//
打印结果如下:
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:24
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:31
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:37
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:42
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:46
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:49
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:52
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:55
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:01
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:04
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:07
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:10
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:24:13
在结果中可以看出执行时只有一个线程在处理任务,当执行任务时间大于间隔时间时,程序会立马执行下个任务,当执行任务时间小于间隔时间时,schedule会按照间隔时间执行。
timer.scheduleAtFixedRate(timeTask, new Date(),3000)//
打印结果如下:
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:30
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:37
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:43
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:48
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:52
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:55
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:57
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:58
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:22:59
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:00
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:03
Thread[Timer-0,5,main]1我被执行了2018-04-28 02:23:06
在结果中可以看出执行时只有一个线程在处理任务,当执行任务时间大于间隔时间时,程序会立马执行下个任务,当执行任务时间小于间隔时间时,scheduleAtFixedRate为了保持频率的稳定性,依然立马执行任务,当频率稳定了,按照间隔时间来执行任务。
schedule的方法:
public void schedule(TimerTask task, Date firstTime, long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), -period);
}
sched(task, firstTime.getTime(), -period);period变成的负数
scheduleAtFixedRated的方法:
public void scheduleAtFixedRate(TimerTask task, Date firstTime,
long period) {
if (period <= 0)
throw new IllegalArgumentException("Non-positive period.");
sched(task, firstTime.getTime(), period);
}
sched(task, firstTime.getTime(), period);没变
算下次执行时间的方法:
queue.rescheduleMin(task.period<0 ? currentTime - task.period
: executionTime + task.period);
在代码可以看出当period为负数时,下次执行时间是当前时间+时间间隔。为正数时是下次执行时间+时间间隔