在我的一系列问题中,接下来就是问题。
我需要一个可由玩家自定义的计时器。在Boggle游戏开始之前,玩家可以选择30到180秒之间的时间。我尝试将Timer
链接到TimerTask
,这在游戏的第一次运行中起作用,但是当我更改TimerTask
中的秒并再次运行时,它表示任务是忙或已被取消。什么是实现计时器的最佳方式,该计时器在游戏开始时具有重置并具有可自定义的时间限制。可以重置Timer
/ TimerTask
吗?
代码:
类CountDown:
public class CountDown {
Timer timer;
DisplayCountDown displayCountDown;
public CountDown(DisplayCountDown displayCountDown) {
timer = new Timer();
this.displayCountDown = displayCountDown;
timer.schedule(this.displayCountDown, 0, 1000);
}
public DisplayCountDown getDisplayCountDown() {
return displayCountDown;
}
public Timer getTimer() {
return timer;
}
}
class DisplayCountDown:
public class DisplayCountDown extends TimerTask {
private int seconds = 30;
public void run() {
if(seconds > 0) {
seconds--;
} else {
return;
}
}
public void setSeconds(int seconds) {
this.seconds = seconds;
}
public int getSeconds() {
return seconds;
}
}
要重置计时器,我试试这个:
countDown = null;
countDown = new CountDown(displayCountDown);
第二次运行时出现此错误:
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled
答案 0 :(得分:2)
“如果计时器的任务执行线程意外终止,例如,因为调用了stop方法,那么在计时器上安排任务的任何进一步尝试都将导致IllegalStateException,就像调用了计时器的cancel方法一样。”
来自http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html
因此,一种解决方案是在取消第一个Timer后创建一个新的。
另一个解决方案是:不是停止和启动计时器,而是可以保持一个计时器永远运行,并让所有DisplayCountDown实例订阅全局计时器(例如,通过填写列表,让计时器迭代列表并通知每个DisplayCountDown)