我了解Servlet请求默认是多线程的。我使用NetBeans创建了一个简单的servlet,它在Tomcat和JBoss上似乎都是单线程的。
我使用以下代码对其进行了测试:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("access processRequest: " + this + " threadID: " + Thread.currentThread().getId());
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Logger.getLogger(OctaveServlet.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("exit processRequest: " + this + " threadID: " + Thread.currentThread().getId());
}
(从doGet调用processRequest)
我几乎同时从浏览器的2个选项卡访问了此选项,如果多线程可以正常工作,我希望它可以打印具有2个不同线程ID的“访问”,然后显示两个线程的“退出”。
相反,我得到以下输出:
14:53:41,839 INFO [stdout](http--127.0.0.1-8080-1)访问过程请求:OctaveServlet @ 31ccfe线程ID:34
14:53:46,840 INFO [stdout](http--127.0.0.1-8080-1)退出进程请求:OctaveServlet @ 31ccfe线程ID:34
14:53:46,867 INFO [stdout](http--127.0.0.1-8080-1)访问过程请求:OctaveServlet @ 31ccfe线程ID:34
14:53:51,867 INFO [stdout](http--127.0.0.1-8080-1)退出进程请求:OctaveServlet @ 31ccfe线程ID:34
如您所见,它只是一个线程。
不用说,我没有实现SingleThreadModel。
以下是我的系统的详细信息:
NetBeans 7.0.1,JVM:Sun Java 1.6.0_26,Tomcat 7.0.14,JBoss AS 7,Ubuntu 11.04
非常感谢您的帮助,
奥德。
最佳答案
每个HTTP连接使用一个线程(这不完全是服务器使用NIO时的情况,但您明白了)。您的浏览器显然在两个选项卡中都使用相同的HTTP连接。生成两个不同的浏览器实例(例如Firefox和Chrome),您会发现它可以按预期的方式工作。
关于multithreading - servlet多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7681291/