以下计划:
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的请求时,一个新线程将这个请求映射到服务器创建的特殊实例。
服务器创建的实例(向哪个线程映射请求)什么时候死?新请求创建的线程何时消亡?
答案 0 :(得分:4)
servlet实例是在webapp启动时或首次需要时创建的(如果设置了lazy-init)。当您的webapp停止时,它被GC处理时被丢弃。在正常的生产环境中,我敢说这从未真正发生过(不计算部署新版本)。
大多数(如果不是全部)servlet容器都使用线程池。这意味着他们重用线程来处理请求。所以这些线程永远不会死;他们在完成执行请求后返回池中。
当然,当你关闭服务器时它们会死掉:)
从您的应用程序的角度来看,您真的应该尝试使您的servlet无状态,并且您可以安全地考虑每个请求都在其自己的专用线程中执行。