竹十一
          在匆忙與奔走中墮落
          關于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 竹十一 閱讀(4990) 評論(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中的一樣.  回復  更多評論   

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          主站蜘蛛池模板: 溧水县| 长垣县| 建瓯市| 兴山县| 峡江县| 丰顺县| 延长县| 来安县| 明光市| 新邵县| 宜阳县| 昌乐县| 汝南县| 景德镇市| 东平县| 灵川县| 齐齐哈尔市| 四会市| 东乌珠穆沁旗| 烟台市| 霍林郭勒市| 天津市| 卢氏县| 镇宁| 舞阳县| 松桃| 庆云县| 西畴县| 和龙市| 永寿县| 新平| 固镇县| 连江县| 开封县| 沈丘县| 五莲县| 炎陵县| 夏津县| 宁化县| 安庆市| 晋城|