私はタイマーを使ってアプリケーションで定期的なイベントをスケジュールしようとしています。しかし、私は、イベントが発生する時間を(ユーザーの入力に応じて)リアルタイムで調整できるようにしたいと考えています。例えばJavaタイマー
:
public class HelperTimer extends TimerTask
{
private Timer timer;
//Default of 15 second between updates
private int secondsToDelay = 15;
public void setPeriod(int seconds)
{
this.secondsToDelay = seconds;
long delay = 1000; // 1 second
long period = 1000*secondsToDelay; // seconds
if (timer != null)
{
timer.cancel();
}
System.out.println(timer);
timer = new Timer();
System.out.println(timer);
timer.schedule(this, delay, period);
}
public int getPeriod()
{
return this.secondsToDelay;
}
}
私は、このクラスの新しいインスタンスを起動し、その設定された期間の関数を呼び出します。しかし、私がそれをすると、私は不正な状態の例外を取得します。あなたはSystem.out.println(タイマー)を見ることができます。私がチェックしているので、十分に彼らは2つの異なったタイマーです...なぜ私は、新しいTimerインスタンスでスケジュール呼び出しを実行しようとするとIllegalStateExceptionを受け取りますか?
[email protected]
[email protected]
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already scheduled or cancelled
at java.util.Timer.sched(Unknown Source)
at java.util.Timer.schedule(Unknown Source)
at HelperTimer.setPeriod(HelperTimer.java:38)
ケビンは言ったように、毎回同じ "this"で "timer.schedule(this、delay、period)"と呼んでいます。 TimerTaskは、複数の異なるタイマーに与えられることを意味しません。各TimerTaskインスタンスは、正確に1回スケジュールされることを意図しています。 – Eddie
ありがとうございました、ドキュメント全体が飛び出すことはありません。新しいTimerTasksの作成に切り替えると、すべてが計画どおりに行われました.. – Zak
スケジュールの指定は次のようになります:@throws IllegalStateException - タスクが既にスケジュールされているか、タイマースレッドが終了しました。 タスクは既に以前のTimerでスケジュールされていたため、例外がスローされました。 – notnoop