多线程-我的线程看起来向被JVM回收/停掉了,网页访问的时候数据不更新,后台通讯模块显示处理请求的servlet没有发送数据包。
最近写了一个小demo,用来看看实现一个系统需要做些什么,其中一个模块A出现了一个很奇怪的问题。
A需要和模块B通过UDP/IP通讯,同时使用servlet应答web请求。我写了一个servlet,在servlet里init中初始化了成员变量dataContainer,启动了dataContainer中的内部类成员DataContainer dc。
dc是一个继承了Thread的类,在run方法中不停与模块B通讯,获取数据,存放在dc的成员变量StringBuffer shared中。
servlet从dataContainer中获取shared的值来响应请求。
开始的时候一切正常,但是运行时间长了之后,我发现我的thread被停止/回收了(不确定)。
大致这样,上代码。
Servlet:
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import support.DataContainer;
/**
* Servlet implementation class DataKeeper
*/
@WebServlet("/DataKeeper")
public class DataService extends HttpServlet {
private static final long serialVersionUID = 1L;
private final DataContainer dc = new DataContainer();
/**
* @see HttpServlet#HttpServlet()
*/
public DataService() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
dc.start();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("a");
PrintWriter out = response.getWriter();
out.append(dc.getState());
out.flush();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题解决了,原因是UDP会有可能丢失数据,然后线程就卡在获取数据上了。
你在调用的servlet的dc.start()前面和在DataContainer 中dc.start()都打一下日志,看看是哪里出了问题,还是抛异常之类的了?捕获一下异常信息打印一下。