在我的一系列令人困惑的问题中,这是下一个。
我需要一个可由玩家自定义的计时器。在 Boggle 游戏开始之前,玩家可以选择 30 到 180 秒之间的时间。我尝试使用链接到 TimerTask 的 Timer 进行尝试,这在游戏第一次运行时有效,但是当我更改 TimerTask 中的秒数时> 然后再运行一次,它说任务正忙或已被取消。实现在游戏开始时重置并具有可自定义时间限制的计时器的最佳方法是什么? Timer
/TimerTask
可以重置吗?
代码:
类(class)倒计时:
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;
}
}
类 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);
第二次运行时出现此错误:
线程“main”中出现异常 java.lang.IllegalStateException:任务已计划或取消
编辑:出了什么问题?为什么这会获得如此多的负面声誉?我不是要求你们给我一个解决方案,我知道你们讨厌它,这根本不是我想要的......我只是想回到正轨,一个类的名称就足够了我...为了清楚起见:我并不是要求一个完整的解决方案,只是为了一些提示:/
最佳答案
“如果计时器的任务执行线程意外终止,例如,由于调用了其 stop 方法,则任何在计时器上调度任务的进一步尝试都将导致 IllegalStateException,就像调用了计时器的 cancel 方法一样。”
来自 http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html
因此,一个解决方案是在取消第一个计时器后创建一个新计时器。
另一种解决方案是:您可以让一个计时器永远持续下去,而不是停止和启动计时器,并让所有 DisplayCountDown 实例订阅全局计时器(例如,通过填写列表,并让计时器迭代该列表)并通知每个 DisplayCountDown)
关于Java:小游戏的可变计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14510344/