Servlets ServletContextListener线程
我目前在webachive中停止后台线程时遇到问题。目前,我将其与战争部署联系在一起,并在取消部署归档文件时将其销毁 线程启动时没有问题,但当我关闭归档时,它似乎失去了线程上的句柄。在以下情况下:Servlets ServletContextListener线程,servlets,Servlets,我目前在webachive中停止后台线程时遇到问题。目前,我将其与战争部署联系在一起,并在取消部署归档文件时将其销毁 线程启动时没有问题,但当我关闭归档时,它似乎失去了线程上的句柄。在以下情况下:st在调用contextdestromed方法时为null 这是一个问题,因为Tomcat在关于内存泄漏的警告中指出线程是孤立的 public class LimitOrderContextListener implements ServletContextListener { static
st
在调用contextdestromed
方法时为null
这是一个问题,因为Tomcat在关于内存泄漏的警告中指出线程是孤立的
public class LimitOrderContextListener implements ServletContextListener {
static Logger logger = Logger.getLogger(LimitOrderRuntime.class.getName());
private SwiftThread st = null;
/**
* Initializes this listener when this war's context is initialized
*/
public void contextInitialized(ServletContextEvent sce)
{
try {
if ( (st == null) || (!st.isAlive()) ) {
LimitOrderRuntime lor = new LimitOrderRuntime();
SwiftThread st = new SwiftThread(lor);
st.start();
} else {
st.gracefulStop();
st.join(2000);
}
} catch(Exception e) {
logger.warn("Unable to properly load thread! " +
e.getMessage() + " --cause " + e.getCause());
e.printStackTrace();
}
}
/**
* When this war is destroyed/stopped, stop the thread.
*/
public void contextDestroyed(ServletContextEvent sce)
{
try {
boolean success = st.gracefulStop();
if (!success) {
st.interrupt();
}
} catch (Exception e) {
logger.warn("Unable to properly release thread! " +
e.getMessage() + " --cause " + e.getCause());
e.printStackTrace();
}
}
}
在
contextInitialized
方法中,您将st重新声明为局部变量,而不是使用线程初始化实例变量
替换
SwiftThread st = new SwiftThread(lor);
与
哦,天哪,多漂亮的植物啊。就是这样;谢谢你指出了一些对我来说应该是显而易见的事情。我期待着从地板上拿出我的分析信心。
this.st = new SwiftThread(lor);