2010-02-15 9 views

risposta

19

Timer di documentation dice il seguente:

compiti timer dovrebbero completare rapidamente. Se un compito del timer impiega troppo tempo per essere completato, "manda" il thread di esecuzione del task del timer. Ciò può, a sua volta, ritardare l'esecuzione delle attività successive, che possono "accumularsi" ed essere eseguite in rapida successione quando (e se) l'attività incriminata finisce finalmente.

Cioè, i thread TimerTask simultanei non saranno in esecuzione. Le attività si accumulano in una coda. Questo può o non può essere appropriato (più probabilmente, non).

+7

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

15

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.

+0

Grazie per aver risposto anche a una correzione –

+2

Come è 'scheduleAtFixedRate' meglio di' Timer' e 'TimerTask'? Entrambi assicurano che la roba avvenga a intervalli fissi, e se l'intervallo passa alla successiva esecuzione, l'esecuzione viene accodata. – SexyBeast

Problemi correlati