타이머를 사용하여 응용 프로그램에서 반복 일정을 예약하려고합니다. 그러나 나는 사용자 입력에 따라 실시간으로 이벤트가 시작되는 기간을 조정할 수 있기를 원합니다. 예를 들어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 (타이머)를 볼 수 있습니다. 거기에서 내가 확인하고 있기 때문에 충분히 확실해, 그들은 두 개의 다른 타이머 ... 그래서 내가 왜 새로운 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)
Kevin이 말한 것처럼 매번 같은 "this"를 사용하여 "timer.schedule (this, delay, period)"를 호출합니다. TimerTask는 여러 다른 타이머에 제공되지 않습니다. 각 TimerTask 인스턴스는 정확히 한 번 예약해야합니다. – Eddie
고마워, 완전히 문서에서 튀어 나오지 않고 새로운 TimerTasks를 생성하자마자 모든 것이 계획대로 진행되었습니다 .. – Zak
일정의 상태는 다음과 같습니다 : @throws IllegalStateException - 작업이 이미 예약되거나 취소 된 경우 타이머 취소되었거나 타이머 스레드가 종료되었습니다. 작업이 이미 이전 타이머에서 예약되었으므로 예외가 throw됩니다. – notnoop