0

私のBoggleの一連の質問では、次の質問があります。

プレイヤーがカスタマイズできるタイマーが必要です。Boggleのゲームが始まる前に、プレーヤーは30〜180秒の時間を選択できます。Timerにリンクして試してみましたがTimerTask、これはゲームの最初の実行で機能しますが、の秒を変更しTimerTaskて別の実行を行うと、タスクがビジーであるかキャンセルされたと表示されます。ゲームの開始時にリセットされ、カスタマイズ可能な時間制限があるタイマーを実装するための最良の方法は何ですか。Timer/TimerTaskをリセットできますか?

コード:

クラスカウントダウン:

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);

2回目に実行すると、このエラーが発生します。 Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled

編集:何が問題なのですか?なぜこれがそれほど否定的な評判を得るのですか?私はあなたたちにただ私に解決策を与えるように求めているのではありません、私はあなたたちがそれを嫌うことを知っています、そしてそれは私が望んでいることではありません...私はただ軌道に戻りたいです、クラスの名前は私...すべての明確さのために:私は完成した解決策を求めているのではなく、いくつかのヒントを求めています:/

4

1 に答える 1

2

「たとえば、stopメソッドが呼び出されたために、タイマーのタスク実行スレッドが予期せず終了した場合、タイマーでタスクをスケジュールしようとすると、タイマーのcancelメソッドが呼び出されたかのようにIllegalStateExceptionが発生します。」

http://docs.oracle.com/javase/6/docs/api/java/util/Timer.htmlから

したがって、1つの解決策は、最初のタイマーをキャンセルした後に新しいタイマーを作成することです。

別の解決策は次のとおりです。タイマーを停止および開始する代わりに、1つのタイマーを永久に実行し続け、すべてのDisplayCountDownインスタンスをグローバルタイマーにサブスクライブさせることができます(たとえば、リストに入力し、タイマーをリストに対して反復して、すべてに通知することによって) DisplayCountDown)

于 2013-01-24T22:22:33.227 に答える