Я разработал веб-приложение, которое широко использует потоки. Нам нужно следить за некоторыми ресурсами через определенные промежутки времени, а затем действовать.
Чтобы достичь этого, мы разработали ThreadManager
, который охватывает one ScheduledThreadPoolExecutor
. Мы разрешаем любой из методов исполнителя, мы используем этот менеджер только для того, чтобы убедиться, что все используют один и тот же экземпляр пула потоков (менеджер - Singleton ...)
Затем, когда мы закрываем контекст, у нас есть ServletContextListener
, который заботится о правильном закрытии исполнителя:
ejecutor.shutdown();
try
{
ejecutor.awaitTermination(10, TimeUnit.SECONDS);
}
catch (InterruptedException ie)
{
Thread.currentThread().interrupt();
}
System.out.println("Llamo al shutdownnow");
ejecutor.shutdownNow();
ejecutor = null;
Но затем, когда мы закрываем tomcat / unload контекст, мы получаем множество ошибок, говорящих:
GRAVE: The web application [/qsys] appears to have started a thread named [pool-4-thread-1] but has failed to stop it. This is very likely to create a memory leak.
Если мы отслеживаем исполнителя, спрашивая количество активных потоков, после завершения работы он продолжает говорить, что активных потоков больше нет, но мы продолжаем обнаруживать ту же ошибку на tomcat.
Есть идеи?
Обновление: больше информации предоставлено
Зависшие потоки - это те, которые запланированы в Executor
. Все они переопределяют interrupt()
так, что это выглядит так:
System.out.println("Me intentan interrumpir!!");
run = false;
super.interrupt();
Затем, во время contextDestroyed
, я выполняю уже упомянутое завершение работы ... но система из прерывания даже не печатается!
Исполнителю присвоено значение ExecuteExistingDelayedTasksAfterShutdownPolicy
, равное false ...
По-прежнему поддерживать темы ...