HttpServlet没有实现runnable或extend thread,为什么它可以线程化?

时间:2011-07-31 08:07:36

标签: java servlets concurrency

对于一个可运行的对象,它需要实现Runnable接口或扩展Thread类,但是HttpServlet似乎不会执行任何这些。

为什么HttpServlet可以被线程化或者我弄错了?

3 个答案:

答案 0 :(得分:13)

Servlet本身不是一个线程。容器维护servlet类的一个实例,每个请求(线程)调用相同的servlet对象。因此servlet实例在线程之间共享。在伪代码中,它可能如下所示:

class ServerThread extends Thread {

    private javax.servlet.Servlet servlet;
    private javax.servlet.ServletRequest req;
    private javax.servlet.ServletResponse res;

    public ServerThread(javax.servlet.Servlet servlet, /* request and response */) {
        this.servlet = servlet;
        this.req = req;
        this.res = res;
    }

    @Override
    public void run() {
        this.servlet.service(req, resp);
    }

}

毫无疑问,实际上它会更复杂,更复杂: - )

BTW:这就是你的servlet类必须是线程安全的原因!

答案 1 :(得分:1)

Java中的任何类都可以在任何线程上执行,除非在运行时通过某种检查明确禁止。在不知道HttpServlet的细节的情况下,我想你在某个地方遇到了HttpServlet线程安全的声明。如果是这种情况,那意味着可以从任意数量的线程中安全地使用类的给定实例(或类的静态方法)。

此外,Thread是可运行的原因是因为它实现了Runnable接口;任何班级都可以这样做。 Thread的{​​{1}}方法的显着方面是,当启动run()实例时,会在单独的线程上调用其Thread方法。

答案 2 :(得分:0)

任何东西都是线程的。 Spring bean的EJB本身不是线程,但它们在多线程环境中运行,因此它们是线程化的。