Timer
e TimerTask
non gestiscono bene questo tipo di situazione. Se vuoi gestirlo meglio, allora non usare quelle classi.
java.util.concurrent.ScheduledExecutorService
fornisce due metodi di pianificazione, scheduleAtFixedRate
e scheduledWithFixedDelay
, che regolano ciò che accade quando le attività "raggruppano".
scheduleAtFixedRate
:
Crea ed esegue un'azione periodica che viene abilitato prima dopo la data ritardo iniziale, e successivamente con periodo specificato; ovvero inizieranno dopo initialDelay quindi initialDelay + period, then initialDelay + 2 * period, e quindi on. Se una qualsiasi esecuzione dell'attività riscontra un'eccezione, le successive esecuzioni vengono eliminate. Altrimenti, l'attività terminerà solo tramite cancellazione o terminazione dell'esecutore . Se qualsiasi esecuzione di questa attività richiede più tempo del suo periodo, , le esecuzioni successive potrebbero iniziare in ritardo , ma non contemporaneamente eseguito.
scheduleWithFixedDelay
:
Crea ed esegue un'azione periodica che viene abilitato prima dopo la dato ritardo iniziale, e successivamente con il ritardo determinato tra l' cessazione di un'esecuzione e la avvio del prossimo. Se qualsiasi esecuzione di dell'attività riscontra un'eccezione , le esecuzioni successive sono soppresse. In caso contrario, l'attività verrà terminata solo tramite annullamento o terminazione dell'esecutore.
È possibile creare ScheduledExecutorService
istanze utilizzando la classe Executors
fabbrica.
Mi piace il modo in cui descrivi "Le attività si accumulano in una coda". Decisamente migliore di come la documentazione descriva come "hogs" e "bunch up". Soprattutto per chi ha un cattivo inglese xD – GMsoF