2015-03-31 109 views
0

我有兩個來自java.util.Timer類的定時器。定時器命中一個條件並啓動另一個定時器,並在它啓動另一個定時器之前停止原始定時器。這回退和進一步如下:兩個定時器互相調用

private void StartGame() 
{ 
    RankTimer.cancel(); 
    InGame = true; 
    timeLeft = GamePeriod; 
    InGameTimer.purge(); 
    InGameTimer.schedule(new TimerTask() { 

     @Override 
     public void run() 
     { 
      timeLeft = timeLeft-timerUpdate; 
      if(timeLeft<=0) 
      { 
       StartRank(); 
      } 
     } 
    }, 0, timerUpdate); 

} 
protected void StartRank() 
{ 

    InGameTimer.cancel(); 
    GameDataChange(); 
    InGame = false; 
    timeLeft = RankPeriod; 
    RankTimer.purge(); 
    RankTimer.schedule(new TimerTask() { 

     @Override 
     public void run() 
     { 
      timeLeft = timeLeft-timerUpdate; 
      if(timeLeft<=0) 
      { 
       StartGame(); 
      } 
     } 
    }, 0, timerUpdate); 
} 

定時器是RankTimer和InGameTimer。當代碼在某個點運行時,出現以下錯誤:

線程「Timer-0」中的異常java.lang.IllegalStateException:計時器已被取消。 (Unknown Source) at demo.ServerGameThread.StartRank(ServerGameThread.java:76) at demo.ServerGameThread $ 1.run(ServerGameThread的.java:64) 在java.util.TimerThread.mainLoop(來源不明) 在java.util.TimerThread.run(來源不明)

我做了一個淨化過之前設置調度。這個想法是,這些計時器將無限地呼喚另一個人在開始自己的任務時停止對方。任何想法爲什麼它失敗?還是有更好的方法來實現我想要做的事情?

回答

0

我意識到,我可以做我想做的只有一個定時這樣:

private void StartGame() 
{ 
    InGame = true; 
    InGrace = false; 
    timeLeft = GamePeriod + GracePeriod + RankPeriod; 

    GameTimer.schedule(new TimerTask() { 

     @Override 
     public void run() 
     { 
      timeLeft = timeLeft-timerUpdate; 
      if(timeLeft<=GracePeriod + RankPeriod && timeLeft>RankPeriod) 
      { 
       InGrace = true; 
      } 
      else if(timeLeft<=RankPeriod && timeLeft>0) 
      { 
       GameDataChange(); 
       InGame = false; 
       InGrace = false; 
      } 
      else if(timeLeft<=0) 
      { 
       InGame = true; 
       timeLeft = GamePeriod + GracePeriod + RankPeriod; 
      } 
     } 
    }, 0, timerUpdate); 

我加入了GRACEPERIOD其中一部分是不是從以前的代碼太大區別。我只是將timeLeft變量重置爲初始值,以再次啓動循環。