【问题标题】:Why does the init() method of a servlet run in a different thread?为什么 servlet 的 init() 方法在不同的线程中运行?
【发布时间】:2019-08-23 08:25:34
【问题描述】:

这是《Head First Servlets and JSP》一书的节选。我不明白为什么init() 方法单独在线程A 中运行,而service() 方法在另一个线程B 之后运行。

这是否意味着从浏览器到 servlet 的每个请求都有两个线程?或者init() 对于容器可能创建的所有 servlet 实例是通用的?那是错误的,因为它不是静态方法?

【问题讨论】:

  • init() 在 servlet 初始化期间只运行一次,并在启动应用程序的线程中运行。另一方面,service() 在随机容器线程上为每个请求调用,通常取自线程池。
  • 正如描述中所写:init 在启动时运行。它不会针对每个请求运行。这有点误导,因为不是每个请求都有不同的线程,但想法是它不是单线程的。

标签: java multithreading jsp tomcat servlets


【解决方案1】:

servlet 仅由init() 初始化一次,但对于每个新请求,都会从池中创建或分配一个新线程,以在适当的方法上调用该 servlet 实例。


HttpRequestHttpResponse 对象对于每个新请求和线程都是新的,但不是 servlet 实例 .

【讨论】:

  • 这回答了这个问题,所以只有在服务器关闭时才会销毁一个 servlet 实例,或者它会在任何时候被销毁(比如它可能是空闲的并且有一段时间没有请求服务)
  • @ArunRajagopal 当服务器关闭或应用程序处理时,所有 Servlet 实例都会被销毁。
  • 记住:你不能手动销毁 Servlet,Servlet 就像工人一样,不是数据容器。
【解决方案2】:

此描述适用于单个 servlet 实例。直觉上你可以认为它是在其他线程中处理请求而不阻塞主线程。如果请求是耗时的,那么冻结应用程序以提供服务是没有意义的,因此每个请求都会导致分叉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2014-03-20
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多