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请求返回的东西?若产生了,此处有什么好的解决办法没有?
2.我觉得不notify就会一直wait,具体也没试过,除非发生InterruptedException,应该就会终止wait
3.标准线程wait模式,会有线程安全问题吗,b怎么会看到a呢
那你的意思是说
1。当线程a进行wait后,及时代码不继续执行完毕,马上就会释放对象锁?
2。问题没解决,不过还是谢谢你
3。servlet的单例会产生线程安全问题,出现过这种现象,当a请求后等待,此时b再请求等待,当a的线程唤醒后,客户端b会收到信息!!不知道这样对不对?谢谢