2011-10-27 13 views
6

Attualmente sto utilizzando un timer per eseguire alcune funzioni ogni intervallo di tempo. Tuttavia, più avanti, quando voglio modificare l'intervallo di esecuzione della funzione, non posso cancellare il programma precedente. come questo può essere risolto? Graziecome cancellare il programma esistente di un timer

+0

cosa intendi con "non posso cancellare il programma precedente"? non sai come farlo, o è che non si adatta alla tua architettura? – njzk2

+0

Desidero annullare la pianificazione precedente e avviare una nuova pianificazione con intervallo diverso. Tuttavia, per il timer, non sembra esserci modo di fare questo .. in modo frustrante – user301

+0

devi effettivamente annullare il timer e ricreare uno – njzk2

risposta

5

Con il metodo timer.cancel() è possibile annullare il timer e tutte le attività programmate. (Vedi API documentation) oppure è possibile chiamare il metodo annullare sul TimerTask timertask.cancel() (vedi API documentation)

Se si desidera modificare il tempo previsto si dovrebbe annullare la TimerTask e aggiungere una nuova TimerTask.

+0

TimerTask # cancel e quindi Timer # purge() non funziona. Funziona ancora. – JohnyTex

3

È possibile esaminare utilizzando ScheduledThreadPoolExecutor anziché Timer.

L'utilizzo è piuttosto semplice. Si crea un'istanza di un esecutore:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 

E poi, quando si desidera aggiungere un compito si chiama:

executor.scheduleAtFixedRate(myRunnable, delay, interval, unit); 

Dove myRunnable è il vostro compito (che implementa il Runnable -interface), delay è quanto tempo prima che l'attività debba essere eseguita la prima volta, interval è il tempo tra l'esecuzione dell'attività dopo la prima esecuzione. delay e interval sono misurati in base al parametro unit, che può essere TimeUnit. * (Dove * è SECONDI, MINUTI, MILLISECONDI ecc.).

per interrompere l'esecuzione si chiama:

executor.shutdownNow(); 

e poi si può ri-inviare il vostro compito con un intervallo diverso.

Nota: potrebbe essere necessario creare una nuova istanza dell'esecutore prima di inviare nuovamente l'attività, ma non sono del tutto sicuro del perché.

+0

come è diverso da un timer? – njzk2

+0

Questo link ti dice un po 'delle differenze: http://www.dremsus.com/index.php/2011/03/why-scheduledthreadpoolexecutor-for-smartfoxserver-2x/ Anche questa domanda su Stackoverflow si rivolge alle differenze: http: //stackoverflow.com/questions/409932/java-timer-vs-executorservice – kaspermoerch

+0

c'è comunque che non sia necessario arrestare l'executor o chiudere il timer? Non voglio creare una nuova istanza dell'oggetto executor o timer ... – user301

Problemi correlati