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

finemi 2015-06-07 04:42:44

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,普通情况下第二个线程是可以进入的,我主要是想做消息推送中,多个接收消息端,可是从第二个接收端开始线程根本就进不去了
...全文
271 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
二十亩鱼 2015-06-10
  • 打赏
  • 举报
回复
引用 13 楼 finemi 的回复:
[quote=引用 11 楼 qq_16216221 的回复:] 使用楼主代码,做了个实验,结论并非楼主那样。 多个请求进入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: 输出,先进入的先出,后进的后出:
已得到答案。原来是一些浏览器对同一地址的get请求会阻塞后面的。 你这加了参数的地址不同。 终于得到答案了[/quote] 得到答案就好,我也受教了,
finemi 2015-06-09
  • 打赏
  • 举报
回复
引用 4 楼 oh_Maxy 的回复:
能把前后台的代码都拉出来看看不? 你也可以试试,不用wait,然后直接在“进入”之后,sleep 十秒钟,然后多个页面同时请求,看看是不是只打一次。
版主能帮我测试下你那的servlet中用sleep或者wait()后面的线程是不是进不去呢
finemi 2015-06-09
  • 打赏
  • 举报
回复
引用 11 楼 qq_16216221 的回复:
使用楼主代码,做了个实验,结论并非楼主那样。 多个请求进入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: 输出,先进入的先出,后进的后出:
已得到答案。原来是一些浏览器对同一地址的get请求会阻塞后面的。 你这加了参数的地址不同。 终于得到答案了
finemi 2015-06-09
  • 打赏
  • 举报
回复
引用 11 楼 qq_16216221 的回复:
不用ie,用火狐或者chorme内核的试试,保准第二个进不去。 我已经知道了,get方式除了IE其他都有问题 post方式没问题,原因不明 你试试
二十亩鱼 2015-06-09
  • 打赏
  • 举报
回复
使用楼主代码,做了个实验,结论并非楼主那样。
多个请求进入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:

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



finemi 2015-06-09
  • 打赏
  • 举报
回复
引用 9 楼 oh_Maxy 的回复:
上面用火狐测的,后来换了ie,结果是会同时进入controller。。。
对,我这也是,chrome和火狐都会,而ie则没问题。 后来发现是get和post不同,使用post方式,不管什么浏览器后面线程都不会阻塞 http://bbs.csdn.net/topics/391050544?page=1#post-399314884
oh_Maxy 2015-06-09
  • 打赏
  • 举报
回复
上面用火狐测的,后来换了ie,结果是会同时进入controller。。。
oh_Maxy 2015-06-09
  • 打赏
  • 举报
回复
用的sleep,两个请求,后面的请求会等前面的结束了才会进去
finemi 2015-06-08
  • 打赏
  • 举报
回复
引用 4 楼 oh_Maxy 的回复:
能把前后台的代码都拉出来看看不? 你也可以试试,不用wait,然后直接在“进入”之后,sleep 十秒钟,然后多个页面同时请求,看看是不是只打一次。
这就是所有的代码了~ 就一个servlet,配置他的url为 /getmsg ,第一个访问输出了进入,第二个请求就一直挂起没有输出 sleep()我也试了的,同一个状况。。。
finemi 2015-06-08
  • 打赏
  • 举报
回复
引用 3 楼 baohuan_love 的回复:
我唯一能确认的是,多线程不管用在哪,原理都一样!
对呀。我也是这样想的,可是用在servlet中就不一样了~
oh_Maxy 2015-06-08
  • 打赏
  • 举报
回复
能把前后台的代码都拉出来看看不? 你也可以试试,不用wait,然后直接在“进入”之后,sleep 十秒钟,然后多个页面同时请求,看看是不是只打一次。
  • 打赏
  • 举报
回复
我唯一能确认的是,多线程不管用在哪,原理都一样!
可乐罐 2015-06-08
  • 打赏
  • 举报
回复
虽然Servlet本身的实现机制就是多线程的, 但如果doget这类的方法中,存在异步代码没试过,估计是这段代码造成。
鸣鸣Amadues 2015-06-07
  • 打赏
  • 举报
回复
你看看他的doget方法有没有什么限制?

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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