最近项目中有一个负责的需求,需要使用定时器在tomcat启动后每隔1小时自动运行一次检查任务,问题的发现很偶然。
修改系统当前时间为未来的时间时,定时器不会出现问题,会一直运行,而把当前时间修改为过去的时间定时器会卡着不执行。
经过分析Timer定时器源码才知,时间往后调定时器一定不会执行的。
JDK1.6源码如下:
/**
* The main timer loop. (See class comment.)
*/
private void mainLoop() {
while (true) {
try {
TimerTask task;
boolean taskFired;
synchronized(queue) {
// Wait for queue to become non-empty
while (queue.isEmpty() && newTasksMayBeScheduled)
queue.wait();
if (queue.isEmpty())
break; // Queue is empty and will forever remain; die
// Queue nonempty; look at first evt and do the right thing
long currentTime, executionTime;
task