实现HTTP长链接,对servlet线程的疑问

zjhlht 2011-01-13 02:02:19

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String eventName = request.getParameter("event");
NameRegister reg = NameRegister.getInstance();
Event event = null;
try {
event = reg.getEvent(eventName);
if(event == null) {
event = new Event(eventName,this);
reg.registeEvent(eventName, event);
}
if(event.getServlet() == null) {
event.setServlet(this);
}
} catch (RegistException e1) {
e1.printStackTrace();
}
synchronized(this) {
while(!event.isProcess()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
EventListener listener = event.getListener();
if(listener != null) {
listener.process(request,response);
}
}

完整代码展示http://www.javaeye.com/topic/293328

这是网上一段实现HTTP长连接的代码,主要就是注册事件,然后进行线程的wait(),当事件触发以后,调用notify()来唤醒线程,向客户端返回信息。问题来了:

synchronized(this) {
while(!event.isProcess()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


在这段代码中利用this来进行同步加锁,(问题1)此处的this应该表示的是servlet这个实例还是处理这个servlet的线程?按个人理解来说这应该是servlet的实例,但servlet是个的单例,当线程a进入synchronized块以后wait()了,那岂不是其他的线程都进不来,在synchronized块外面挂起了,而并不是通过wait()挂起的??
(问题2),当线程a通过wait()挂起后,在注册的事件还没有触发的时候,此时客户端浏览器关闭了,那此时该线程是否还是在服务器端挂起?例如tomcat是25个请求线程,当用户反复请求,且不触发每次注册的事件(即不进行notify()),当线程挂起的25个的时候,tomcat将怎么处理?

(问题3),此种方法利用synchronized来进行wait(),是否会产生线程安全的问题,如a,b两个用户,b看到了a请求返回的东西?若产生了,此处有什么好的解决办法没有?
...全文
212 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjhlht 2011-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dracularking 的回复:]
1.通过wait,a线程wait之后,就释放了对象锁,b线程遂可进入同步块,继续wait
2.我觉得不notify就会一直wait,具体也没试过,除非发生InterruptedException,应该就会终止wait
3.标准线程wait模式,会有线程安全问题吗,b怎么会看到a呢
[/Quote]

那你的意思是说
1。当线程a进行wait后,及时代码不继续执行完毕,马上就会释放对象锁?
2。问题没解决,不过还是谢谢你
3。servlet的单例会产生线程安全问题,出现过这种现象,当a请求后等待,此时b再请求等待,当a的线程唤醒后,客户端b会收到信息!!不知道这样对不对?谢谢
dracularking 2011-01-14
  • 打赏
  • 举报
回复
1.通过wait,a线程wait之后,就释放了对象锁,b线程遂可进入同步块,继续wait
2.我觉得不notify就会一直wait,具体也没试过,除非发生InterruptedException,应该就会终止wait
3.标准线程wait模式,会有线程安全问题吗,b怎么会看到a呢
zjhlht 2011-01-14
  • 打赏
  • 举报
回复
请教问题啊!!!谁能详细说明一下!
zjhlht 2011-01-13
  • 打赏
  • 举报
回复
有大师不吝赐教没~~~~万分感激!
zjhlht 2011-01-13
  • 打赏
  • 举报
回复
能详细解释下我的问题么?

非常感谢!!!!
  • 打赏
  • 举报
回复
this 是 Servlet 实例,不是请求线程。Servlet 实例只有一个。

用 synchronized(request) 就是请求线程了。

PS:在 Servlet 端实现 HTTP 长连接很复杂,建议使用开源框架,或者使用 Servlet 3.0 中的 AsyncContext

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧