【发布时间】:2011-07-09 04:28:07
【问题描述】:
众所周知,当 servlet 收到请求时,它会创建一个新线程,并在新线程内调用 service 方法。所以只有一个 Servlet 实例,就会调用很多线程。
我不明白的是HttpServlet 是如何在不实现可运行或扩展线程的情况下创建自己实例的线程的?
谁能解释一下。
【问题讨论】:
标签: java jakarta-ee
众所周知,当 servlet 收到请求时,它会创建一个新线程,并在新线程内调用 service 方法。所以只有一个 Servlet 实例,就会调用很多线程。
我不明白的是HttpServlet 是如何在不实现可运行或扩展线程的情况下创建自己实例的线程的?
谁能解释一下。
【问题讨论】:
标签: java jakarta-ee
众所周知,当 servlet 收到请求时,它会创建一个新线程,并在新线程内调用 service 方法。因此,只有一个 Servlet 实例,就会调用许多线程。
事实上,这是不正确的。 Web 容器通常维护一个有界的工作线程池来处理请求。不会为每个新请求创建新线程。
我不明白的是 HttpServlet 是如何在不实现可运行或扩展线程的情况下创建自己实例的线程的?
基本上没有。 HttpServlet 不创建线程,也不是线程,也不是runnable。
Web 容器具有实现Runnable 或扩展Thread 的特定实现类。这些类调用(共享)Servlet 实例上的相关方法。
【讨论】:
这由 Servlet 容器(也称为 Web 容器)处理。 Servlet Container 负责维护 Servlet 生命周期。
http://en.wikipedia.org/wiki/Java_Servlet
servlet 的生命周期
- 容器调用无参数构造函数。
- Web 容器调用init() 方法。该方法初始化 servlet,必须在生命之前调用 servlet 的 init() 方法是 只调用一次。
- 初始化后,servlet 可以为客户端请求提供服务。每个 请求以自己的方式提供服务 单独的线程。网络容器 调用 service() 方法 每个请求的 servlet。这 service() 方法确定种类 提出和发送的请求 它以适当的方法来处理 请求。开发者 servlet 必须提供一个实现 对于这些方法。如果一个请求 未实现的方法 servlet 的制作方法 通常调用父类 导致返回错误 给请求者。
- 最后,Web 容器调用 destroy() 方法,该方法获取 servlet 停止服务。销毁() 方法,如 init(),只被调用 在 servlet 的生命周期中执行一次。
【讨论】: