Bir uygulamada yinelenen bir olay zamanlamak için bir zamanlayıcı kullanmaya çalışıyorum. Ancak, olayın gerçek zamanlı olarak (kullanıcı girdisine göre) hareket ettiği süreyi ayarlayabilmek istiyorum. ÖrneğinJava Timer
:
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;
}
}
Sonra bu sınıfın yeni bir örneğini başlatmak ve süre belirleme işlevini çağırın. Ancak, bunu yaptığımda Yasa dışı bir durum istisnası alıyorum. System.out.println (zamanlayıcı) görebilirsiniz; Orada kontrol ettiğimden ve yeterince emin olduğumdan, iki farklı zamanlayıcılar ... neden yeni bir Timer örneğinde bir program çağrısı çalıştırmayı denediğimde neden bir IllegalStateException alıyorum!?!?!?!
[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'in dediği gibi, "timer.schedule (bu, gecikme, nokta)" ifadesini her seferinde aynı "bu" ile çağırıyorsunuz. TimerTask, birden fazla farklı zamanlayıcıya verilmek zorunda değildir. Her bir TimerTask örneğinin tam olarak bir defa planlanması gerekir. – Eddie
Teşekkürler, bu tamamen dokümantasyondan çıkmıyor ve yeni TimerTasks oluşturmaya geçtiğimde, her şey plana göre değişti .. – Zak
Zamanlama durumlarının belirtimi: Görev zaten planlanmış veya iptal edilmişse, @throws İllegalStateException iptal edildi veya zamanlayıcı iş parçacığı sonlandırıldı. Görev zaten daha eski bir Zamanlayıcısında planlanmıştı, dolayısıyla istisna atılıyordu. – notnoop