我是servlet的新手,我注意到来自同一浏览器(不同的浏览器标签)的多个请求导致了相同的线程。我知道线程是从一个线程池分配的,我认为这可能是巧合,但经过几次尝试后,我仍然看到相同的结果。
以下是我在Tomcat 7中使用的代码。
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException {
HttpSession session = request.getSession();
System.out.println("Current thread: " + Thread.currentThread().getName() + " -- Session ID: " + session.getId());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Current thread: " + Thread.currentThread().getName() + " -- done ...");
response.getWriter().println("Hello");
}
以下是在同一浏览器中从2个选项卡发送2个请求后的输出。生成2个请求之间的时差小于一秒。
Current thread: http-bio-8080-exec-54 -- Session ID: A74D21132DDED8F35280117E8040CD72
Current thread: http-bio-8080-exec-54 -- done ...
Current thread: http-bio-8080-exec-54 -- Session ID: A74D21132DDED8F35280117E8040CD72
Current thread: http-bio-8080-exec-54 -- done ...
但是当请求从不同的浏览器发送时,我得到了所需的结果。
Current thread: http-bio-8080-exec-57 -- Session ID: A74D21132DDED8F35280117E8040CD72
Current thread: http-bio-8080-exec-55 -- Session ID: 7BE3E5007F49A8301BE792B10E665D75
Current thread: http-bio-8080-exec-57 -- done ...
Current thread: http-bio-8080-exec-55 -- done ...
每个会话的线程是否是Tomcat中的默认行为?有没有办法在Tomcat中为来自同一浏览器的多个请求获取不同的线程?我在会话逻辑上测试同步。