Java:小游戏的可更改计时器

时间:2013-01-24 20:42:28

标签: java timer

在我的一系列问题中,接下来就是问题。

我需要一个可由玩家自定义的计时器。在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

编辑:错了什么?为什么这会产生如此多的负面声誉?我不是要求你们给我一个解决方案,我知道你们讨厌它而且根本不是我想要的......我只是想回到正轨,一个名字一个班级对我来说已经足够了......为了清楚起见:我不是要求一个完整的解决方案,只是为了一些提示:/

1 个答案:

答案 0 :(得分:2)

“如果计时器的任务执行线程意外终止,例如,因为调用了stop方法,那么在计时器上安排任务的任何进一步尝试都将导致IllegalStateException,就像调用了计时器的cancel方法一样。”

来自http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

因此,一种解决方案是在取消第一个Timer后创建一个新的。

另一个解决方案是:不是停止和启动计时器,而是可以保持一个计时器永远运行,并让所有DisplayCountDown实例订阅全局计时器(例如,通过填写列表,让计时器迭代列表并通知每个DisplayCountDown)