public class GetMessageServlet extends HttpServlet {
private static String abc = "123";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("进入");//第二个请求无法输出
synchronized (abc) {
try {
abc.wait(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
所有请求全部使用同一个同步监视器abc,但是每个线程进入后都会执行abc.wait()并释放锁,为什么我只能第一个请求进入输出“进入”,第二个请求连“进入”都没有输出呢?,当第一个线程5秒超时后,第二个线程才输出“进入”,难道servlet中的多线程有什么不同?
不使用servlet,普通情况下第二个线程是可以进入的,我主要是想做消息推送中,多个接收消息端,可是从第二个接收端开始线程根本就进不去了
------解决思路----------------------
你看看他的doget方法有没有什么限制?
------解决思路----------------------
虽然Servlet本身的实现机制就是多线程的,
但如果doget这类的方法中,存在异步代码没试过,估计是这段代码造成。
------解决思路----------------------
我唯一能确认的是,多线程不管用在哪,原理都一样!
------解决思路----------------------
用的sleep,两个请求,后面的请求会等前面的结束了才会进去
------解决思路----------------------
上面用火狐测的,后来换了ie,结果是会同时进入controller。。。
------解决思路----------------------
使用楼主代码,做了个实验,结论并非楼主那样。
多个请求进入servlet后,都会输出:“进入”,先进的先输入,进入等待。。。,后进入的也会输出:“进入”,进入等待。。。
public class GetMessageServlet extends HttpServlet {
private static String abc = "123";
private static final long serialVersionUID = 1L;
public GetMessageServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String name = request.getParameter("name");
System.out.println(name+":进入");//第二个请求无法输出
synchronized (abc) {
try {
abc.wait(5000);
System.out.println(name+":出来");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
访问servlet:
输出,先进入的先出,后进的后出: