关于java多线程的疑问

zk1878 2011-11-29 11:16:26
大家都知道,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呢
...全文
139 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
icare 2011-11-30
  • 打赏
  • 举报
回复
very nice!!!mark 关注。等待高手解答
zk1878 2011-11-30
  • 打赏
  • 举报
回复
难道大家都不好奇么,这个我觉得是个必须清楚的大问题,我们老是说servlet方法是线程不安全的,servlet内不要放置成员变量,但又找不出实际的场景测试,有点搞笑啊
zk1878 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ticmy 的回复:]

sysout纳秒级的时间就可以处理完,可以写个程序用URLConnection去多线程循环访问
[/Quote]
我这里对web容器如何管理servlet,管理线程很模糊,web容器是在什么时候生成一个线程呢,请求到来?还是对同个session开个线程?又或是其他呢,写代码用urlconnection连接没试过,等会试试看吧。

写这个文章的目的是,想看看servlet的多线程场景在什么情况下出现,上面的这个例子没出现多线程的场景,也不知怎么才能出现
zk1878 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coolbamboo2008 的回复:]

我觉得是session并没有消亡,还是同一个会话
[/Quote]
这里是分别打三个不同浏览器,打印三个不同的sessionid,由此可见是三个不同session
coolbamboo2008 2011-11-30
  • 打赏
  • 举报
回复
我觉得是session并没有消亡,还是同一个会话
龙四 2011-11-30
  • 打赏
  • 举报
回复
sysout纳秒级的时间就可以处理完,可以写个程序用URLConnection去多线程循环访问
hehecafe 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dracularking 的回复:]

引用 6 楼 zk1878 的回复:

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

这个实验不就证明了多用户访问不是多线程,即非线程安全了么
不过这里是没有必要多线程
[/Quote]


单线程就无法并发,B/S系统基本上都不会是只有一个用户同时使用的,所以开发B/S系统都是要考虑多线程的。不断的创建线程对资源的开销比较大,因此采用线程池,就跟连接池一样。
hehecafe 2011-11-30
  • 打赏
  • 举报
回复
其实,Web容器应该都会采用线程池,可反复使用池中的线程。你3个浏览器发出的请求都是由线程池中的同一个线程来处理的,所以线程ID是一样的。

如果想看到不同的线程ID,可以加上sleep的代码,休眠一段时间(比切换浏览器并请求的时间长即可),这样Web容器应当会分配不同的线程来处理请求。
dracularking 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zk1878 的回复:]

难道大家都不好奇么,这个我觉得是个必须清楚的大问题,我们老是说servlet方法是线程不安全的,servlet内不要放置成员变量,但又找不出实际的场景测试,有点搞笑啊
[/Quote]
这个实验不就证明了多用户访问不是多线程,即非线程安全了么
不过这里是没有必要多线程

67,512

社区成员

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

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