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

Suh*_*pta 6 java multithreading persistence servlets java-ee

以下程序:

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" );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Joe*_*ckx 3

servlet 实例是在您的 web 应用程序启动时或首次需要它时创建的(如果设置了lazy-init)。当你的 web 应用程序停止时,当它被 GC 时,它会被丢弃。在正常的生产环境中,我敢说这种情况永远不会真正发生(不包括部署新版本)。

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

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

从应用程序的角度来看,您确实应该尝试使 servlet 无状态,并且您可以放心地认为每个请求都在其自己的专用线程中执行。