Timer的使用
Timer是java中提供的定时任务调度,
在不使用第三方工具包的情况下可以使用Timer来实现定时器,不过Timer中提供的功能较少
Timer中的方法并不多
TimerTask
TimerTask实现Runnable接口
1 2 3
| public abstract class TimerTask implements Runnable{
}
|
虽然TimerTask类实现了Runnable接口,但是该类并没有作为一个线程来使用,run方法只是作为一个普通的方法进行调用的
任务有四种状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
static final int VIRGIN = 0;
static final int SCHEDULED = 1;
static final int EXECUTED = 2;
static final int CANCELLED = 3;
|
schedule方法
schedule属于固定时延调度,会随着任务执行时间来顺延
1 2 3 4 5 6 7
| public void schedule(TimerTask task, long delay, long period) { if (delay < 0) throw new IllegalArgumentException("Negative delay."); if (period <= 0) throw new IllegalArgumentException("Non-positive period."); sched(task, System.currentTimeMillis()+delay, -period); }
|
可以看到,在传入sched方法时,period取反了
在执行任务时判断
1 2 3 4 5 6 7 8 9 10 11 12 13
| if (taskFired = (executionTime<=currentTime)) { if (task.period == 0) { queue.removeMin(); task.state = TimerTask.EXECUTED; } else { queue.rescheduleMin( task.period<0 ? currentTime - task.period : executionTime + task.period); } }
|
scheduleAtFixedRate方法
scheduleAtFixedRate属于固定速率调度,
cancel方法
cancel用于取消任务
1 2 3 4 5 6 7 8 9 10
| public void cancel() { synchronized(queue) { thread.newTasksMayBeScheduled = false; queue.clear(); queue.notify(); } }
|
purge方法
purge方法用于清空队列中CANCELLED状态的任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public int purge() { int result = 0;
synchronized(queue) { for (int i = queue.size(); i > 0; i--) { if (queue.get(i).state == TimerTask.CANCELLED) { queue.quickRemove(i); result++; } }
if (result != 0) queue.heapify(); }
return result; }
|