2012-03-29 16 views
5

Sto utilizzando ScheduledExecutorService per eseguire i thread pianificati.
Ho implementato ServletContextListener.contextDestroyed e invocato ScheduledExecutorService.shutdownNow e awaitTermination.Tomcat 7 e ScheduledExecutorService.shutdown

Ecco un esempio:

@Override 
public void contextDestroyed(ServletContextEvent servletcontextevent) { 
    pool.shutdownNow(); // Disable new tasks from being submitted 
    try { 
     // Wait a while for existing tasks to terminate 
     if (!pool.awaitTermination(50, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     System.err.println("Pool did not terminate"); 
     } 
    } catch (InterruptedException ie) { 
     // (Re-)Cancel if current thread also interrupted 
     pool.shutdownNow(); 
     // Preserve interrupt status 
     Thread.currentThread().interrupt(); 
    }   
} 


Eppure, sto ottenendo il seguente errore da Tomcat 7:

GRAVI: L'applicazione web [/ servlet] sembra aver iniziato una thread denominato [Timer-0] ma non è riuscito a fermarlo. È molto probabile che crei una perdita di memoria.

Questo log può essere ignorato? O sto facendo qualcosa di sbagliato?

Grazie

+0

Voglio dire, il mio pensiero è: dove si fermano le responsabilità per la pulizia? Cos'altro si può fare qui? Colpire la scatola con una manichetta antincendio? In tutta serietà, quello che intendo dire è che sembra che tu stia facendo tutto quello che puoi fare ... Ignorerei quell'errore. – ControlAltDel

+0

Puoi riferirti al mio post precedente :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili

risposta

4

Sei sicuro che questo errore sia correlato al tuo pool di thread? A giudicare dal nome del thread 'Timer-0' probabilmente era stato avviato da una sorta di timer.

Inoltre, shutdownNow() dovrebbe restituire l'elenco delle attività che attendono ancora la chiusura (vedere JavaDoc). È possibile creare la logica per attendere di più se l'elenco non è vuoto.

1

È corretto spegnere il ScheduledExecutorService. Tuttavia, i thread creati da ExecutorService seguono questa convenzione di denominazione: pool-X-thread-Y.

Timer-0 thread sono creati da classe Timer. Cercali nel tuo codice e nelle tue librerie.