两个定时器互相打电话

时间:2015-03-31 03:06:15

标签: java timer

我有两个来自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。当代码在某一点运行时,我收到以下错误:

线程中的异常&#34; Timer-0&#34; java.lang.IllegalStateException:Timer已被取消。     在java.util.Timer.sched(未知来源)     在java.util.Timer.schedule(未知来源)     在demo.ServerGameThread.StartRank(ServerGameThread.java:76)     在demo.ServerGameThread $ 1.run(ServerGameThread.java:64)     at java.util.TimerThread.mainLoop(Unknown Source)     在java.util.TimerThread.run(未知来源)

在设置调度程序之前,我也进行了清除。我们的想法是,这些计时器将在启动自己的任务时无限地相互呼叫相互阻止。任何想法为什么会失败?或者有更好的方法来实现我想要做的事情吗?

1 个答案:

答案 0 :(得分: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变量重置为它的初始起始值以再次开始循环。