2010-02-16 14 views
9

que tienen una tarea programada (que se ejecuta en la ejecución de retardo fijo), comenzó así:¿Cuál es la forma correcta de reiniciar una tarea programada de ScheduledExecutorService?

executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

En cada inicio de ciclo, puedo comprobar si hay un cambio en un archivo de configuración, y luego deseo reiniciar la tarea . El archivo de configuración también contiene la longitud del intervalo (numOfSeconds en el código anterior).

Actualmente, estoy usando el siguiente código para reiniciar la tarea:

executoreService.shutdownNow(); 
try { 
while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){ 
    logger.debug("awaiting termintation"); 
} 
} catch (InterruptedException e) { 
logger.debug("interrupted, continuing", e); 
} 
// initialize startup parameters 
init(); 
// start the main scheduled timer 
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

No estoy seguro acerca de estas llamadas a la API. ¿Cuál es la forma recomendada de reiniciar la tarea (posiblemente con un nuevo retraso)?

Respuesta

13

No, no desea o no necesita cerrar todo el servicio solo para modificar una tarea. En su lugar, use el objeto ScheduledFuture que obtiene del servicio para cancelar la tarea y luego programe una nueva.

ScheduledFuture<?> future = executorService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 
... 
// to cancel it: 
future.cancel(true); 
// then schedule again 

Alternativamente, ¿por qué no simplemente actualizar el estado en cualquier repetición de hilo con nuevas configuraciones o parámetros? ni siquiera necesita reprogramarse, si no necesita un nuevo retraso.

+0

Es algo a tener en cuenta, pero es más fácil implementar algo que cubrirá cualquier caso de cambio de configuración. es decir, cualquier cambio en el archivo de configuración * puede * también cambiar el retraso. Entonces, en lugar de verificar si la demora se modificó y luego hacer una cosa, y si no era otra cosa, preferiría reiniciar en cualquier caso. – Ovesh

Cuestiones relacionadas