Dalle mie letture, sembra che ScheduledExecutorService sia il modo giusto per avviare e arrestare i timer in Java.utilizzando ScheduledExecutorService per avviare e arrestare il timer
Ho bisogno di portare un codice che avvia e ferma un timer. Questo non è un timer periodico. Questo codice, arresta il timer prima di avviarlo. Quindi, effettivamente ogni avvio è davvero un riavvio(). Sto cercando il modo giusto per farlo utilizzando ScheduledExecutorService. Ecco cosa mi è venuto in mente. In cerca di commenti e approfondimenti sulle cose che mi manca:
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, rublo
Codice come scritto non verrà compilato: _batchTimer in startTimer() non è dichiarato da nessuna parte. Sarebbe utile se potessi approfondire in dettaglio i comportamenti previsti: quali sono i valori di ritorno di startTimer e stopTimer? Perché vuoi che start/stopTimer blocchi potenzialmente le chiamate? – Sbodd
@Sbodd, quando vado ad avviare un timer, se c'è già un timer in esecuzione, voglio interromperlo, in modo da non avere due timer che scoppino allo stesso tempo. Penso che invece di get() lì, ho solo bisogno di chiamare cancel() sull'istanza futura. – rouble