Tomcat 7 и ScheduledExecutorService.shutdown

Я использую 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:

СЕРЬЕЗНЫЙ: Веб-приложение [/servlet], похоже, запустило поток с именем [Timer-0], но не смогло его остановить. Это очень вероятно, чтобы создать утечку памяти.

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

Спасибо


person lili    schedule 29.03.2012    source источник
comment
Я имею в виду, моя мысль такова: на чем заканчиваются ваши обязанности по уборке? Что еще здесь можно сделать? Ударить коробку пожарным шлангом? Если серьезно, я хочу сказать, что похоже, что вы делаете все, что можете... Я бы проигнорировал эту ошибку.   -  person ControlAltDel    schedule 29.03.2012
comment
Вы можете сослаться на мой предыдущий пост :) stackoverflow. com/questions/9926356/   -  person lili    schedule 30.03.2012


Ответы (2)


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

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

person maximdim    schedule 29.03.2012

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

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

person Tomasz Nurkiewicz    schedule 29.03.2012
comment
Ожидает ли shutDownNow() запланированные задачи или задачи, которые выполняются в данный момент? Или оба? Есть ли способ ждать только тех задач, которые выполняются в данный момент (скажем, я не хочу ждать задачи, которую я запланировал выполнить через час, но я хочу дождаться задачи, которая в данный момент находится в середине ее выполнения). execute() метод)? - person theyuv; 01.07.2019