在我的网络应用程序中,我创建了一个使用ExecutorService
具有固定大小的线程池。我重复使用相同的ExecutorService
在整个应用程序生命周期内。
private static ExecutorService pool = Executors.newFixedThreadPool(8);
一切都在 Tomcat 中运行,关闭时出现以下错误:
appears to have started a thread named [pool-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.
我确实意识到我需要在关闭 tomcat 之前关闭 ExecutorService。 Soms SO 线程已经谈到了这个问题,但我找不到一个干净的方法来处理这个问题。
我应该使用ShutdownHook
正如@Tim-bender 建议的那样线程和执行器的正常关闭 https://stackoverflow.com/questions/3332832/graceful-shutdown-of-threads-and-executor?或者我应该使用 CachedThreadPool 来代替?
在 Tomcat 中,关闭挂钩不是一个好方法,因为:
它会太晚关闭池(关闭时),Tomcat 会警告您未关闭的资源
您实际上希望在取消部署应用程序时关闭该池,以便重新部署工作(否则每个应用程序将创建新的池,并且只有在完全关闭时它们才会全部关闭)
关闭线程池可能需要一些时间(见下文),关闭钩子应该尽可能快
更好的地方是ServletContextListener.contextDestroyed() http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html#contextDestroyed%28javax.servlet.ServletContextEvent%29。请记住,您必须两者兼而有之shutdownNow()
池(取消运行并拒绝新任务)和awaitTermination()
等待已经运行的任务完成并且所有线程停止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)