servlet中的线程

时间:2013-09-22 14:26:15

标签: java multithreading servlets

在应用程序中,如果涉及多个servlet,则每次为不同的servlet创建新线程

对于ex我有2个servlet servlet 1和servlet 2都从相同的html表单获取rquest,一个是通过锚标签而另一个通过表单

当点击链接时,请求被发送到servlet,它再次向索引页面发送请求,并从那里提交表单,其中请求被发送到servlet 2

为servlet 1和servlet 2创建了两个线程,还是只创建了一个为两个servlet服务的线程?

4 个答案:

答案 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)

  1. 每个http请求都在一个单独的线程中处理,并且创建线程会增加一些开销,因此服务器维护一个线程池,当请求进入时,他们只是重用一个免费线程来提供该请求。
  2. 如果您在一个servlet中创建一个会话并设置一个会话属性,那么该会话可以在任何其他servlet中访问该会话属性。