Tomcat 7 и ScheduledExecutorService.shutdown - PullRequest
5 голосов
/ 29 марта 2012

Я использую ScheduledExecutorService для запуска запланированных потоков.
Я реализовал ServletContextListener.contextDestroyed и вызвал ScheduledExecutorService.shutdownNow и awaitTermination.

Вот пример:

@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: веб-приложение [/ servlet], похоже, запустило поток с именем [Timer-0], но не получилосьчтобы остановить это.Это может привести к утечке памяти.

Можно ли игнорировать этот журнал?Или я что-то не так делаю?

Спасибо

Ответы [ 2 ]

4 голосов
/ 29 марта 2012

Вы уверены, что эта ошибка связана с вашим пулом потоков? Судя по имени потока «Таймер-0», он, вероятно, был запущен каким-то таймером.

Кроме того, вы shutdownNow () должны вернуть вам список задач, которые все еще ожидают завершения (см. JavaDoc). Вы можете построить логику, чтобы ждать больше, если список не пуст.

1 голос
/ 29 марта 2012

Вы правильно выключаете ScheduledExecutorService.Однако потоки, созданные ExecutorService по умолчанию, следуют следующему соглашению об именах: pool-X-thread-Y.

Timer-0 потоки создаются классом Timer.Ищите их в своем коде и библиотеках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...