2012-03-29 15 views
5

Używam ScheduledExecutorService do uruchamiania zaplanowanych wątków.
Zaimplementowałem ServletContextListener.contextDestroyed i wywołałem ScheduledExecutorService.shutdownNow i awaitTermination.Tomcat 7 i ScheduledExecutorService.shutdown

Oto przykład:

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


Wciąż otrzymuję następujący błąd z Tomcat 7:

ciężkie: Aplikacja internetowa [/ servlet] wydaje się rozpoczął wątek o nazwie [Timer-0], ale nie udało się go zatrzymać. Jest to bardzo prawdopodobne, aby utworzyć wyciek pamięci.

Czy ten dziennik można zignorować? Czy robię coś nie tak?

Dzięki

+0

Mam na myśli moją myśl: gdzie kończą się twoje obowiązki dotyczące sprzątania? Co jeszcze można tutaj zrobić? Hit box z wężem pożarniczym? Mówiąc poważnie, chcę powiedzieć, że wygląda na to, że robisz wszystko, co możesz zrobić ... Zignorowałbym ten błąd. – ControlAltDel

+0

Możesz polecić mój poprzedni post :) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili

Odpowiedz

4

Czy na pewno ten błąd jest związany z pulą wątków? Sądząc po nazwie wątku "Timer-0", prawdopodobnie został uruchomiony przez jakiś zegar.

Ponadto, shutdownNow() powinien zwrócić ci listę zadań, które wciąż czekają na zakończenie (patrz JavaDoc). Można zbudować logikę, aby czekać dłużej, jeśli lista nie jest pusta.

1

Jesteś poprawnie wyłączania ScheduledExecutorService. Jednak wątki utworzone domyślnie przez ExecutorService są zgodne z konwencją nazewnictwa: pool-X-thread-Y.

Timer-0 wątki są tworzone przez klasę Timer. Poszukaj ich w swoim kodzie i bibliotekach.