2015-03-31 38 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变量重置为初始值,以再次启动循环。