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
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
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
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