【问题标题】:How HttpServlet can create threads without implementing Runnable or extending threadHttpServlet 如何在不实现 Runnable 或扩展线程的情况下创建线程
【发布时间】:2011-07-09 04:28:07
【问题描述】:

众所周知,当 servlet 收到请求时,它会创建一个新线程,并在新线程内调用 service 方法。所以只有一个 Servlet 实例,就会调用很多线程。

我不明白的是HttpServlet 是如何在不实现可运行或扩展线程的情况下创建自己实例的线程的?

谁能解释一下。

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    众所周知,当 servlet 收到请求时,它会创建一个新线程,并在新线程内调用 service 方法。因此,只有一个 Servlet 实例,就会调用许多线程。

    事实上,这是不正确的。 Web 容器通常维护一个有界的工作线程池来处理请求。不会为每个新请求创建新线程。

    我不明白的是 HttpServlet 是如何在不实现可运行或扩展线程的情况下创建自己实例的线程的?

    基本上没有。 HttpServlet 不创建线程,也不是线程,也不是runnable。

    Web 容器具有实现Runnable 或扩展Thread 的特定实现类。这些类调用(共享)Servlet 实例上的相关方法。

    【讨论】:

    • 知道了。所以一个具有 servlet 实例并实现可运行或扩展线程的单独类在新线程中调用 servlet 的服务方法。感谢您的澄清以及工作线程的澄清。
    【解决方案2】:

    这由 Servlet 容器(也称为 Web 容器)处理。 Servlet Container 负责维护 Servlet 生命周期。

    http://en.wikipedia.org/wiki/Java_Servlet

    servlet 的生命周期

    1. 容器调用无参数构造函数。
    2. Web 容器调用init() 方法。该方法初始化 servlet,必须在生命之前调用 servlet 的 init() 方法是 只调用一次。
    3. 初始化后,servlet 可以为客户端请求提供服务。每个 请求以自己的方式提供服务 单独的线程。网络容器 调用 service() 方法 每个请求的 servlet。这 service() 方法确定种类 提出和发送的请求 它以适当的方法来处理 请求。开发者 servlet 必须提供一个实现 对于这些方法。如果一个请求 未实现的方法 servlet 的制作方法 通常调用父类 导致返回错误 给请求者。
    4. 最后,Web 容器调用 destroy() 方法,该方法获取 servlet 停止服务。销毁() 方法,如 init(),只被调用 在 servlet 的生命周期中执行一次。

    【讨论】:

    • 我了解上面 servlet 的生命周期。但是我的问题是,从技术上讲,如何创建一个 Servlet 类的线程并实现可运行或扩展线程?
    • 没有什么比“Servlet 线程”更好的了,只有一个被所有工作线程使用的 Servlet 实例。对象实例不属于线程;它们可以从每个现有线程中调用——有时甚至是并发的,这使得多线程编程变得如此困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2018-01-10
    • 2011-01-22
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多