2012-03-29 5 views
5

Ich verwende ScheduledExecutorService, um geplante Threads auszuführen.
Ich habe ServletContextListener.contextDestroyed implementiert und ScheduledExecutorService.shutdownNow und awaitTermination aufgerufen.Tomcat 7 und ScheduledExecutorService.shutdown

Hier ist ein Beispiel:

SCHWEREN: Die Web-Anwendung [/ Servlet] erscheint ein begonnen haben

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


Aber ich bin von Tomcat 7 die folgende Störung zu erhalten Thread mit dem Namen [Timer-0], konnte jedoch nicht gestoppt werden. Dies ist sehr wahrscheinlich , um ein Speicherleck zu erstellen.

Kann dieses Protokoll ignoriert werden? Oder mache ich etwas falsch?

Dank

+0

Ich meine, mein Gedanke ist: Wo hört Ihre Verantwortung für Aufräumarbeiten auf? Was kann hier noch getan werden? Hit the box mit einem Feuerwehrschlauch? In aller Ernsthaftigkeit, was ich damit sagen will, ist, dass es so aussieht, als würden Sie alles tun, was Sie tun können ... Ich würde diesen Fehler ignorieren. – ControlAltDel

+0

Sie können meine vorherige Post beziehen :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoiced – lili

Antwort

4

Sind Sie sicher, dass dieser Fehler mit Ihrem Threadpool zusammenhängt? Gemessen am Thread-Namen 'Timer-0' wurde er wahrscheinlich von einer Art Timer gestartet.

Auch Sie shutdownNow() sollte Ihnen die Liste der Aufgaben zurückgeben, die noch auf die Beendigung warten (siehe JavaDoc). Sie könnten Logik erstellen, um mehr zu warten, wenn die Liste nicht leer ist.

1

Sie sind herunter die korrekte Schreibweise Ihrer ScheduledExecutorService nach unten. Die standardmäßig von ExecutorService erstellten Threads folgen jedoch dieser Namenskonvention: pool-X-thread-Y.

Timer-0 Gewinde werden von Timer Klasse erstellt. Suchen Sie in Ihrem Code und in Ihren Bibliotheken nach ihnen.