在应用程序中,如果涉及多个servlet,则每次为不同的servlet创建新线程
对于ex我有2个servlet servlet 1和servlet 2都从相同的html表单获取rquest,一个是通过锚标签而另一个通过表单
当点击链接时,请求被发送到servlet,它再次向索引页面发送请求,并从那里提交表单,其中请求被发送到servlet 2
为servlet 1和servlet 2创建了两个线程,还是只创建了一个为两个servlet服务的线程?
答案 0 :(得分:5)
Servlet容器的一般模式是使用一个Thread
来处理一个请求。
对于ex我有2个servlet servlet 1和servlet 2都得到了 从同一个html表单获取rquest是通过锚标记和 另一种形式
当您提交form
时,浏览器会发送HTTP请求。您的服务器将调度Thread
来处理它。想想它做这样的事情(实际上要复杂得多)
final Servlet servlet = ...// which servlet is url-mapped to the request
Runnable toRun = new Runnable(
public void run() {
servlet.service(request, response); // with exception handling of course
}
);
Thread toDispatch = new Thread(toRun); // actually get it from pool, but for simplicity
toDispatch.start();
同样,如果您按照锚链接,您的浏览器会发送一个新的HTTP请求,并以相同的方式处理。
Servlet
类实例在线程之间共享。
答案 1 :(得分:3)
当请求到达Servlet容器(例如:Tomcat,WAS)时,它通常从ThreadPool中随机选取一个线程,并且所选择的线程将在整个请求生命周期中处理所接收的请求。换句话说,从UI层到服务层到数据层执行相同的线程。并且无法保证在后续请求中分配相同的线程,即使您单击相同的链接,该链接又将请求提交给同一个servlet。据说有可能在立即请求中由Container拾取相同的线程。
如果要测试,请在Servlet中打印线程名称并多次提交请求。在您的示例中,多次单击锚链接并查看结果。
回答您的问题: 如上所述,首先,每次请求到达时都不会创建新线程。 Servlet2可能会使用相同的线程。
答案 2 :(得分:1)
对Web服务器的每个请求都由来自线程池的新线程提供。并且servlet实例在请求(即线程)之间共享。所以好的设计实践在servlet中没有全局变量,否则会看到竞争条件。
答案 3 :(得分:0)