Когда умирает экземпляр, созданный сервером? - PullRequest
6 голосов
/ 30 января 2012

Следующая программа:

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" );
    }
}

печатает увеличенное значение счетчика каждый раз, когда я получаю доступ к URL этого сервлета.Я прочитал, что сервер создает экземпляр этого сервлета, и всякий раз, когда есть запрос на этот сервлет, новый поток отображает этот запрос на специальный экземпляр, созданный сервером.

Когда экземпляр, созданный сервером (в какой поток отображает запрос) , умирает?Когда умирают потоки, созданные новым запросом?

1 Ответ

4 голосов
/ 30 января 2012

Экземпляр сервлета создается при запуске вашего веб-приложения или когда это требуется в первый раз (если установлен lazy-init).Он удаляется, когда ваше веб-приложение останавливается, когда оно GCed.В обычной производственной среде я бы осмелился заявить, что этого никогда не происходит (не считая развертывания новой версии).

Большинство (если не все) контейнеры сервлетов работают с пулом потоков.Это означает, что они повторно используют потоки для обработки запросов.Так что эти темы никогда не умирают;они возвращаются в пул, когда завершают выполнение запроса.

Конечно, они умирают, когда вы выключаете сервер:)

С точки зрения вашего приложения, вы действительно должны попытаться сделать свой сервлет не имеющим состояния, и вы можете смело считать, что каждыйзапрос выполняется в собственном выделенном потоке.

...