当前位置: 代码迷 >> J2EE >> Servlet中使用多线程的wait()方法后,第二个线程无法进入,该如何解决
  详细解决方案

Servlet中使用多线程的wait()方法后,第二个线程无法进入,该如何解决

热度:91   发布时间:2016-04-17 23:10:08.0
Servlet中使用多线程的wait()方法后,第二个线程无法进入

public class GetMessageServlet extends HttpServlet {
private static String abc = "123";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletExceptionIOException {
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:

输出,先进入的先出,后进的后出:



  相关解决方案