我开发了一个广泛使用线程的Webbapp。我们需要以固定的时间间隔监控一些资源然后采取行动。
为实现这一目标,我们开发了一个包含一个 ThreadManager
的{{1}}。我们允许执行者的任何方法,我们只使用这个管理器来确保每个人都使用相同的线程池实例(管理器是一个Singleton ......)
然后,当我们关闭上下文时,我们有ScheduledThreadPoolExecutor
负责正确关闭执行程序:
ServletContextListener
但是,当我们关闭tomcat /卸载上下文时,我们会遇到很多错误:
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上找到相同的错误。
有什么想法吗?
更新:提供了更多信息
挂起的线程是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.
中计划的线程。所有这些都覆盖了Executor
,所以它就像:
interrupt()
然后,在System.out.println("Me intentan interrumpir!!");
run = false;
super.interrupt();
执行已经提到的关闭期间......但是从中断中退出的系统甚至没有打印出来!
执行者将contextDestroyed
设置为false ...
仍然保持线程活着......
答案 0 :(得分:0)
最后,我发现了一些东西:
我每次使用ScheduledThreadPoolExecutor
tomcat都无法关闭undeploy / close / restart上的池化线程,从而导致可能的内存泄漏(应该没问题,因为tomcat无法关闭它们,但之后它会杀死它们,所以没问题,但客户不会允许它......),而其他服务器就像魅力......
事实上,我创建了一个核心大小为25的ScheduledThreadPoolExecutor,然后关闭它(没有运行或计划),而tomcat仍然无法清理池化的线程。
所以我的解决方案是使用Timer,而我等待补丁...(它发生在tomcat 6.0& jdk 1.5.0_22)