关于java多线程的疑问
大家都知道,servlet是单例的,即web容器只对某个servlet创建一次,以后的请求如果请求的是该servlet,则所有请求共用一个servlet实例,于是我想测试一下,servlet在多线程下的表现。以下是个servlet类
public class MServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException,
IOException {
System.out.println(request.getSession().getId()+","+Thread.currentThread().getId());
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
地址为http://localhost:8080/shiro-web/ms
我分别打开3个浏览器,敲入以上地址,可奇怪的是
三次打印的thread id都是一样的,
各位高人有谁懂为什么么
另外,在什么情况下或者我怎么操作,才可以看到打印不同的thread id呢
------解决方案--------------------
其实,Web容器应该都会采用线程池,可反复使用池中的线程。你3个浏览器发出的请求都是由线程池中的同一个线程来处理的,所以线程ID是一样的。
如果想看到不同的线程ID,可以加上sleep的代码,休眠一段时间(比切换浏览器并请求的时间长即可),这样Web容器应当会分配不同的线程来处理请求。
------解决方案--------------------