2012-03-29 18 views
10

Io uso ScheduledExecutorService nella mia applicazione. Ho bisogno di usarlo di volta in volta in determinate classi di Utility per eseguire thread programmati.ScheduledExecutorService: quando deve essere richiamato l'arresto?

E 'un buon progetto tenere premuto ScheduledExecutorService nel campo statico? È necessario richiamare ScheduledExecutorService.shutdown() in questo caso? Qual è il rischio se non invoco shutdown?

Questo è quello che ho pensato di fare:

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); 
} 

Grazie

risposta

5

Si dovrebbe sempre invocare shutdown() o shutdownNow(). In caso contrario, l'applicazione potrebbe non terminare mai in quanto vi sono ancora thread attivi (a seconda di come si sta chiudendo l'app, se è in ambiente gestito o meno, ecc.).

In genere si chiama shutdown() da una sorta di metodo di evento del ciclo di vita, ad esempio da Spring's DisposableBean.destroy(), o se non si utilizza alcun framework, basta chiamarlo prima di uscire dall'app.

+0

Ho provato ad aggiungere scheduledExecutor.shutdownNow(); nel mio ServletContextListener, ma ottengo un errore nel registro di tomcat che dice "L'applicazione web [/ servlet] sembra aver avviato un thread chiamato [Timer-0] ma non è riuscito a fermarlo. È molto probabile che crei una perdita di memoria. ". Come posso evitare questo errore? Grazie per l'aiuto – lili

+0

shutdownNow() è una chiamata non bloccante che restituirebbe immediatamente. Dovresti chiamare awaitTermination() dopo di ciò che bloccherebbe fino a quando il pool di thread non sarà effettivamente attivo. – maximdim

+0

Ho provato, non ha funzionato. Dovrei aspettare più di 30 secondi? Ho scritto più dettagli in http://stackoverflow.com/questions/9930624/tomcat7-and-scheduledexecutorservice-shutdownnow grazie – lili

3

Effective Java 2 ° Ed afferma:

E qui è come dire l'esecutore di interrompere con garbo (se si non riescono a farlo, è probabile che la tua VM non esca):

executor.shutdown();

Problemi correlati