竹十一
在匆忙与奔走中堕落
关于Timer运行时修改系统时间

对Sun JDK的Timer来说,系统时间修改到当前时间之后,不会影响Timer的执行;但是如果系统时间修改到当前时间之前,就会导致Timer挂起。

下面这段代码就是根本原因了(取自sun jdk1.4.2 source code, java.util.Timer#mainLoop() line 415~426):

    currentTime 
= System.currentTimeMillis();
    executionTime 
= task.nextExecutionTime;
    
if (taskFired = (executionTime<=currentTime)) {
        
if (task.period == 0) { // Non-repeating, remove
            queue.removeMin();
            task.state 
= TimerTask.EXECUTED;
        } 
else { // Repeating task, reschedule
            queue.rescheduleMin(
              task.period
<0 ? currentTime   - task.period
                            : executionTime 
+ task.period);
        }
    }

    注:period就是TimeTask初始化时设定的执行间隔,taskFired是个boolean。
   
从这段代码可以看出,TimerTask执行的条件是(executionTime<=currentTime)。其中executionTime取自TimerTask,而currentTime来自系统时间。原因就在于此,currentTime因为修改系统时间而提前了,所以这个条件(executionTime<=currentTime)永远也不会达到,TimerTask将不会被执行。

避免方法:在修改系统时间后重新启动应用:)


posted on 2007-12-04 16:40 竹十一 阅读(4933) 评论(2)  编辑  收藏 所属分类: JSE
Comments
  • # re: 关于Timer运行时修改系统时间
    北京时间
    Posted @ 2008-12-30 13:02
    TimerTask将不会被执行。  回复  更多评论   
  • # re: 关于Timer运行时修改系统时间[未登录]
    aa
    Posted @ 2009-07-27 15:14
    好象不是,timer停止一段时间后又重新开始.我使用jdk1.6测试的,但是代码和 jdk1.4.2 source code中的一样.  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: