2011-10-27 14 views
6

Actualmente estoy usando un temporizador para ejecutar alguna función cada intervalo de tiempo. Sin embargo, más adelante cuando quiero cambiar el intervalo de ejecución de la función, no puedo cancelar el programa anterior. ¿Cómo se puede resolver esto? Graciascómo cancelar la programación existente de un temporizador

+0

¿qué quiere decir "no puedo cancelar el horario anterior"? ¿No sabes cómo hacerlo, o es que no se ajusta a tu arquitectura? – njzk2

+0

Quiero cancelar el programa anterior y comenzar un nuevo horario con un intervalo diferente. Sin embargo, para el temporizador, parece que no hay forma de hacer esto ... tan frustrante – user301

+0

que tiene que cancelar el temporizador y recrear uno – njzk2

Respuesta

5

Con el método timer.cancel() puede cancelar el temporizador y todas las tareas programadas. (Ver API documentation) o puede llamar al método cancelar en su TimerTask timertask.cancel() (ver API documentation)

Si desea cambiar la hora programada se debe cancelar el TimerTask y añadir un nuevo TimerTask.

+0

TimerTask # cancel y luego Timer # purge() no funciona. Todavía se ejecuta. – JohnyTex

3

Podría considerar utilizar un ScheduledThreadPoolExecutor en lugar de un Timer.

El uso es bastante directo. Se crea una instancia de un ejecutor:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); 

Y luego cuando se desea añadir una tarea de llamar:

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

Dónde myRunnable es su tarea (que implementa el -interface Runnable), es delay cuánto tiempo antes de que se ejecute la tarea la primera vez, interval es el tiempo transcurrido entre la ejecución de la tarea después de la primera ejecución. delay y interval se miden según el parámetro unit, que puede ser TimeUnit. * (Donde * es SECONDS, MINUTES, MILLISECONDS etc.).

continuación para detener la ejecución de llamar:

executor.shutdownNow(); 

y luego se puede volver a presentar su tarea con un intervalo diferente.

Nota: Puede que necesite crear una nueva instancia del ejecutor antes de volver a enviar su tarea, pero no estoy muy seguro de por qué.

+0

¿cómo es diferente de un temporizador? – njzk2

+0

Este enlace le dice un poco sobre las diferencias: http://www.dremsus.com/index.php/2011/03/why-scheduledthreadpoolexecutor-for-smartfoxserver-2x/ También esta pregunta sobre Stackoverflow aborda las diferencias: http: //stackoverflow.com/questions/409932/java-timer-vs-executorservice – kaspermoerch

+0

¿Hay alguna forma de que no necesite cerrar el ejecutor o cerrar el temporizador? No quiero crear una nueva instancia del ejecutor o el objeto del temporizador ... – user301

Cuestiones relacionadas