schedule
yöntemine ikinci parametre zamanlayıcı görevi başlar (veya şimdi göreceli gecikme), zamanlayıcı için çalıştırır o zamanın değil uzunluğu zamanıdır.
Sorunuzdan tamamen açık değil, ancak gelecekte belirli zamanlarda (veya şimdiki zamana göre gecikme) başlama ve durma görevini istediğinizi varsayıyorum. Eğer öyleyse, buna yaklaşımım gereği, ihtiyacınız olan görevi yapan bir Thread
oluşturmaktır. TimerTask
, Thread
olarak çalıştırılan bir Runnable
olduğundan, Timer
başlatıldığında, yalnızca TimerTask
'un bir örneğini kullanabilirsiniz. Runnable
'un running
gibi ayarlanabilir bir alan içerdiğinden emin olun. Bu Konudaki olarak, böyle bir süre döngü içinde görevi çalıştırın:
public void run() {
while(running) { /* do my task */ }
}
Sonra, ihtiyaç anda başlamak için bir
Timer
Runnable
planlamak için kullanın. Aynı Thread'in
running
parametresini, durdurmak istediğiniz zamanda false olarak ayarlamak için başka bir Zamanlayıcı kullanın.
running
parametresi, ikinci zamanlayıcı iş parçacığındaki değişikliklerin, hemen ilk zamanlayıcı iş parçacığı tarafından göründüğünden emin olmak için uçucu olmalıdır. Yani böyle bir şey (değil test) görünecektir: senin "bir şey" ne bağlı
class StoppableTimerTask extends TimerTask {
private volatile boolean running = true;
public void stopRunning() { this.running = false; }
public void run() {
while(running) { /* do my task */ }
}
}
final StoppableTimerTask task = new StoppableTimerTask();
timer.schedule(task, startTime);
timer.schedule(new TimerTask() {
public void run() {
task.stopRunning();
}
}, stopTime);
, ayrıca Konu kesmeleri içine bakmak isteyebilirsiniz. Örneğin, IO engelleniyorsa kodunuz dönmez ve engelleme IO tamamlanana kadar running
değerini kontrol edin. İpliği kesmek (olabilir) bunun olmasına neden olur. Bakınız http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#interrupt--. Bu, işe yarayabilir ya da çalışmayabilir ve doğru olması zor olabilir. Bu nedenle, bu iş parçacığına mümkün olan en yakın süreye çıkmak için ihtiyacınız varsa, I/O ve benzeri işlemleri daha küçük zaman aşımları ile engellemeyi tercih edin, böylece iş parçacığı daha sık çalışmaya devam edip etmediğini kontrol edin.
UPDATE: Görevin baştan başladığını belirten yoruma göre, daha da basit hale gelir. İlk görev, TimerTask
'u uzatmaya bile gerek duymaz - bu, hemen başlatılan düzenli bir Thread
olabilir. Zamanlayıcının sadece ileride belirtilen zamanda durması gerekir.
Görevin hem belirli zamanlarda hem de gelecekte başlayıp durmasını mı istiyor musunuz? Öyleyse, aşağıdaki cevabımı inceleyin, aksi halde lütfen sorunu açıklayın. – Raman
Programın hemen çağrılmaya başlamasını isterim ve 60 saniye boyunca sürekli olarak herhangi bir durma veya uyku olmaksızın belirli bir işlevi çalıştırmayı isterim ve 60 saniye boyunca sürekli olarak çalıştıktan sonra, görevi zorla durdurmasını istiyorum. – thotheolh