Okumalarımdan, ScheduledExecutorService, Java'daki zamanlayıcıları başlatıp durdurmanın doğru yolu gibi görünüyor.Zamanlayıcısını başlatmak ve durdurmak için ScheduledExecutorService'ı kullanma
Zamanlayıcıyı başlatan ve durduran bazı kodları kullanmam gerekiyor. Bu periyodik bir zamanlayıcı değil. Bu kod, başlamadan önce zamanlayıcıyı durdurur. Yani, etkili bir şekilde her başlangıç gerçekten bir yeniden başlatmadır(). ScheduledExecutorService kullanarak bunu yapmak için doğru yolu arıyorum. İşte neyle geldiğini. şeyleri ben eksik yapılan yorumlar ve anlayış Aranan:
ScheduledExecutorService _Timer = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> _TimerFuture = null;
private boolean startTimer() {
try {
if (_TimerFuture != null) {
//cancel execution of the future task (TimerPopTask())
//If task is already running, do not interrupt it.
_TimerFuture.cancel(false);
}
_TimerFuture = _Timer.schedule(new TimerPopTask(),
TIMER_IN_SECONDS,
TimeUnit.SECONDS);
return true;
} catch (Exception e) {
return false;
}
}
private boolean stopTimer() {
try {
if (_TimerFuture != null) {
//cancel execution of the future task (TimerPopTask())
//If task is already running, interrupt it here.
_TimerFuture.cancel(true);
}
return true;
} catch (Exception e) {
return false;
}
}
private class TimerPopTask implements Runnable {
public void run() {
TimerPopped();
}
}
public void TimerPopped() {
//Do Something
}
tia, ruble
Bu sorun gibi görünüyor
Kodu yazıldığı gibi derlenmez: startTimer() içindeki _batchTimer hiçbir yerde bildirilmez. Beklenen davranışlarda biraz daha ayrıntıya girebilmeniz yararlı olur: startTimer ve stopTimer öğelerinden dönüş değerleri nedir? Start/stopTimer'in aramaları potansiyel olarak engellemesini neden istiyorsunuz? – Sbodd
@Sbodd, bir zamanlayıcıyı başlatmaya gittiğimde, zaten bir zamanlayıcı çalışıyorsa, bunu durdurmak istiyorum, böylece aynı anda iki zamanlayıcı yok. Ben get() orada yerine, sadece gelecekteki örneğinde cancel() çağırmak gerektiğini düşünüyorum. – rouble