2012-03-29 12 views
5

スケジュールされたスレッドを実行するのにScheduledExecutorServiceを使用しています。
ServletContextListener.contextDestroyedを実装し、ScheduledExecutorService.shutdownNowawaitTerminationを呼び出しました。ここでTomcat 7とScheduledExecutorService.shutdown

は一例です:

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


はそれでも、私は、Tomcat 7から次のエラーを取得しています:

SEVERE:Webアプリケーション[/サーブレット]は開始しているように見えます [Timer-0]という名前のスレッドで、スレッドを停止できませんでした。これはおそらくメモリリークを作成する です。

このログは無視できますか?または私は何か間違っている?

おかげ

+0

私の考えは次のとおりです。クリーンアップの責任はどこで止まりますか?ここで何ができるのですか?消防ホースで箱を叩く? すべての深刻なことに、私が言いたいことは、あなたができることすべてについてやっているように見えるということです。私はそのエラーを無視したいと思います。 – ControlAltDel

+0

あなたは私の以前の投稿を参照するかもしれません:) http://stackoverflow.com/questions/9926356/scheduledexecutorservice-when-shutdown-should-be-invoked – lili

答えて

4

このエラーはあなたのスレッドプールに関連していますか?スレッド名 'Timer-0'で判断すると、おそらく何らかのタイマーによって開始されているはずです。

また、shutdownNow()は、まだ終了を待っているタスクの一覧を返す必要があります(JavaDocを参照)。リストが空でなければ、もっと待つロジックを構築することができます。

1

あなたは正しくScheduledExecutorServiceをシャットダウンされています。ただし、デフォルトでExecutorServiceによって作成されたスレッドは、この命名規則に従います。pool-X-thread-Y

Timer-0スレッドはTimerクラスで作成されます。あなたのコードとライブラリでそれらを探します。