2012-03-29 8 views
10

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

Respuesta

5

Siempre debe invocar shutdown() o shutdownNow(). Si no lo haces, es posible que tu aplicación nunca finalice ya que todavía hay subprocesos activos (dependiendo de cómo termines tu aplicación, ya sea en un entorno administrado o no, etc.).

Normalmente se llama a shutdown() de algún tipo de método de evento de ciclo de vida, como Spring's DisposableBean.destroy(), o si no está utilizando ningún framework solo llámelo antes de salir de su aplicación.

+0

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

+0

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

+0

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

3

eficaz de Java 2ª Ed dice:

Y aquí es cómo contar el ejecutor termina correctamente (si deje de hacer esto, es probable que su VM no salga):

executor.shutdown();

Cuestiones relacionadas