Yo uso ScheduledExecutorService en mi aplicación. Necesito usarlo de vez en cuando en cierta clase de Utilidad para ejecutar subprocesos programados.ScheduledExcutorService: ¿cuándo debería invocarse el apagado?
¿Es un buen diseño para mantener ScheduledExecutorService en el campo estático? ¿Es obligatorio invocar ScheduledExecutorService.shutdown() en tal caso? ¿Cuál es el riesgo si no invoco el cierre?
Eso es lo que pensaba hacer:
private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5);
public void scheduleTask(String name) {
Future<?> future = futuresMapping.get(name);
if(future!=null && !future.isDone())
future.cancel(true);
//execute once
Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES);
futuresMapping.put(name, f);
}
Gracias
Traté de agregar ScheduleExecutor.shutdownNow(); en mi ServletContextListener, pero obtengo un error en el registro de tomcat que dice "La aplicación web [/ servlet] parece haber iniciado un hilo llamado [Timer-0] pero no ha podido detenerlo. Es muy probable que cree una pérdida de memoria. ". ¿Cómo puedo evitar este error? Gracias por su ayuda – lili
shutdownNow() es una llamada no bloqueante que se devolverá de inmediato. Debería llamar a awaitTermination() después de eso, lo que bloquearía hasta que el grupo de subprocesos realmente caiga. – maximdim
Lo intenté, no funcionó. ¿Debo esperar más de 30 segundos? Escribí más detalles en http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow gracias – lili