2016-03-19 22 views
0

Belirli bir süre için sürekli olarak belirli bir zamanlama setini TimerTask içinde sürekli olarak nasıl çalıştırabilirim? Aşağıda, yukarıdakileri uygulamaya çalıştığım kodlar verilmiştir.Java TimerTask içinde sürekli olarak bir görev yürütme TimerTask

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    public void run() { 
     System.out.println("Test started at: " + new Date()); 

     // Do something continuously without delay 

     System.out.println("Test finished at: " + new Date());       
    } 
}, 0); 
+1

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

+0

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

cevap

1

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.

+0

Bu, aradığım şeye çok yakın. Teşekkürler. – thotheolh

+0

@thotheolh Yardım etmek için memnun oldum, güncellememi yaptığım yoruma cevaben not aldım. – Raman

İlgili konular