我有两个来自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(未知来源)
在设置调度程序之前,我也进行了清除。我们的想法是,这些计时器将在启动自己的任务时无限地相互呼叫相互阻止。任何想法为什么会失败?或者有更好的方法来实现我想要做的事情吗?
答案 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变量重置为它的初始起始值以再次开始循环。