多线程通信的一个有关问题
多线程通信的一个问题
模拟的一个AJAX长轮训服务器推送的代码, 另外分别有两个Servlet,其中一个Servlet用来获取消息,另外一个用来发送。两个Servlet都使用Message.currentSessionMessage()方法获取当前HttpSession的Message对象进行通信。
另外有两个jsp页面,一个jsp里面使用AJAX长轮训访问第一个Servlet获取消息,第二个JSP就是一个普通表单调用第二个Servlet发送消息。
简单得说就是一个获取消息端(getmsg.jsp & GetMsgServelt),一个发送端(sendmsg.jsp & SendMsgServlet)。
问题是:
当获取消息端getmsg.jsp页面只打开一个时,能够正常接收服务器推送的消息。
但是当我打开两个getmsg.jsp页面时,sendmsg.jsp中发送的消息,只会有一个getmsg.jsp页面获取到,一会第一个得到,一会第二个得到,不固定。按理说应该是两个页面都获取得到呀!
------解决思路----------------------
我只知道生产者消费者要把if改成while,防止第二个线程跳过判断,正在学java,你写的我还看不懂。。。
------解决思路----------------------
sendservlet:
List.add(string);
getservlet:
for (int i=map.get(session.getID()); i<list.size(); i++) { response.write(list.get(i)); }
map.put(session.getID(), list.size())
------解决思路----------------------
如果我没记错wait是等待。你的唤醒呢?
------解决思路----------------------
尽量别用this.wait()来表示锁等待。
可以顶一个静态常量,比如public static final Object lock = new Object(),然后用lock.wait和lock.notify/notifyAll来表示等待和释放锁。
模拟的一个AJAX长轮训服务器推送的代码, 另外分别有两个Servlet,其中一个Servlet用来获取消息,另外一个用来发送。两个Servlet都使用Message.currentSessionMessage()方法获取当前HttpSession的Message对象进行通信。
另外有两个jsp页面,一个jsp里面使用AJAX长轮训访问第一个Servlet获取消息,第二个JSP就是一个普通表单调用第二个Servlet发送消息。
简单得说就是一个获取消息端(getmsg.jsp & GetMsgServelt),一个发送端(sendmsg.jsp & SendMsgServlet)。
问题是:
当获取消息端getmsg.jsp页面只打开一个时,能够正常接收服务器推送的消息。
但是当我打开两个getmsg.jsp页面时,sendmsg.jsp中发送的消息,只会有一个getmsg.jsp页面获取到,一会第一个得到,一会第二个得到,不固定。按理说应该是两个页面都获取得到呀!
public class Message {
private String message;
/**
* 取消息,如果没有则阻塞线程直到有消息为止或超时
* @param timeout 超时时间,单位秒,0为永不超时。
* @return
*/
public synchronized String getMessage(int timeout){
if(message == null){
try {
if(timeout==0)
this.wait();
else
this.wait(timeout*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String msg = message;
message = null;
return msg;
}
public synchronized void setMessage(String msg){
this.message = msg;
this.notifyAll();
}
private Message(){
}
public static Message currentSessionMessage(HttpSession sess){
Message msg = (Message) sess.getAttribute("message");
if(msg == null){
msg = new Message();
sess.setAttribute("message", msg);
}
return msg;
}
}
------解决思路----------------------
我只知道生产者消费者要把if改成while,防止第二个线程跳过判断,正在学java,你写的我还看不懂。。。
------解决思路----------------------
sendservlet:
List.add(string);
getservlet:
for (int i=map.get(session.getID()); i<list.size(); i++) { response.write(list.get(i)); }
map.put(session.getID(), list.size())
------解决思路----------------------
如果我没记错wait是等待。你的唤醒呢?
------解决思路----------------------
尽量别用this.wait()来表示锁等待。
可以顶一个静态常量,比如public static final Object lock = new Object(),然后用lock.wait和lock.notify/notifyAll来表示等待和释放锁。