多线程-我的线程看起来向被JVM回收/停掉了,网页访问的时候数据不更新,后台通讯模块显示处理请求的servlet没有发送数据包。

多线程-我的线程看起来向被JVM回收/停掉了,网页访问的时候数据不更新,后台通讯模块显示处理请求的servlet没有发送数据包。

晚风撩人 发布于 2016-12-12 字数 2507 浏览 1229 回复 2

最近写了一个小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
}

}

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜无邪 2017-03-07 2 楼

问题解决了,原因是UDP会有可能丢失数据,然后线程就卡在获取数据上了。

清晨说ぺ晚安 2016-12-18 1 楼

你在调用的servlet的dc.start()前面和在DataContainer 中dc.start()都打一下日志,看看是哪里出了问题,还是抛异常之类的了?捕获一下异常信息打印一下。