服务器创建的实例何时死亡?

时间:2012-01-30 16:34:14

标签: java multithreading java-ee servlets persistence

以下计划:

public class SimpleCounter extends HttpServlet {

    int counter=0;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/plain");
        PrintWriter writer = response.getWriter();
        counter++;
        writer.println("accessed " + counter + " times" );
    }
}
每次访问此servlet的url时,

都会打印计数器的递增值。我读到服务器创建了这个servlet的一个实例,每当有一个对这个servlet的请求时,一个新线程将这个请求映射到服务器创建的特殊实例。

服务器创建的实例(向哪个线程映射请求)什么时候死?新请求创建的线程何时消亡?

1 个答案:

答案 0 :(得分:4)

servlet实例是在webapp启动时或首次需要时创建的(如果设置了lazy-init)。当您的webapp停止时,它被GC处理时被丢弃。在正常的生产环境中,我敢说这从未真正发生过(不计算部署新版本)。

大多数(如果不是全部)servlet容器都使用线程池。这意味着他们重用线程来处理请求。所以这些线程永远不会死;他们在完成执行请求后返回池中。

当然,当你关闭服务器时它们会死掉:)

从您的应用程序的角度来看,您真的应该尝试使您的servlet无状态,并且您可以安全地考虑每个请求都在其自己的专用线程中执行。