大家都知道,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呢

解决方案 »

  1.   

    sysout纳秒级的时间就可以处理完,可以写个程序用URLConnection去多线程循环访问
      

  2.   

    我觉得是session并没有消亡,还是同一个会话
      

  3.   

    这里是分别打三个不同浏览器,打印三个不同的sessionid,由此可见是三个不同session
      

  4.   

    我这里对web容器如何管理servlet,管理线程很模糊,web容器是在什么时候生成一个线程呢,请求到来?还是对同个session开个线程?又或是其他呢,写代码用urlconnection连接没试过,等会试试看吧。写这个文章的目的是,想看看servlet的多线程场景在什么情况下出现,上面的这个例子没出现多线程的场景,也不知怎么才能出现
      

  5.   

    难道大家都不好奇么,这个我觉得是个必须清楚的大问题,我们老是说servlet方法是线程不安全的,servlet内不要放置成员变量,但又找不出实际的场景测试,有点搞笑啊 
      

  6.   

    very nice!!! 关注。等待高手解答
      

  7.   

    其实,Web容器应该都会采用线程池,可反复使用池中的线程。你3个浏览器发出的请求都是由线程池中的同一个线程来处理的,所以线程ID是一样的。如果想看到不同的线程ID,可以加上sleep的代码,休眠一段时间(比切换浏览器并请求的时间长即可),这样Web容器应当会分配不同的线程来处理请求。
      

  8.   

    单线程就无法并发,B/S系统基本上都不会是只有一个用户同时使用的,所以开发B/S系统都是要考虑多线程的。不断的创建线程对资源的开销比较大,因此采用线程池,就跟连接池一样。