我的应用程序中有一个线程池,我想在应用程序停止时关闭它。我试过三种方法:
1.在上下文中被摧毁:
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("CALLING CONTEXT DESTROYED.");
PersistSigningExecutor.getService().shutdown();
}
2.关注任何servlet的destroy方法:
@Override
public void destroy() {
super.destroy();
System.out.println("SHUTTING DOWN THREAD-POOLS");
PersistSigningExecutor.getService().shutdown();
}
3.在contextInitialised中添加关闭钩子
@Override
public void contextInitialized(ServletContextEvent sce) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
System.out.println("SHUTTING DOWN THREAD-POOLS");
PersistSigningExecutor.getService().shutdown();
}
});
}
但他们都没有工作。我没有看到任何印刷声明。而且最后我得到日志说:
SEVERE: The web application [/app] 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.
表示线程仍未关闭。如何在关闭服务器或取消部署应用程序时正确关闭此线程池?
答案 0 :(得分:0)
制作线程恶魔(setDamon(boolean)
),以便在jvm开始关闭时停止,基本上恶魔线程不会阻止JVM关闭。
否则,如果您打算使用ExecutorService
,则需要致电shutdown()
或shutdownNow()
。
如果您需要更多帮助,请与我联系。