HttpServlet没有实现runnable或扩展线程,为什么它可以使用多线程?

4

一个对象要能够运行,它需要实现 Runnable 接口或继承 Thread 类,然而,似乎 HttpServlet 都没有做到这些。

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


1
仅仅因为某个东西是“线程安全”的(我理解为可多线程处理的意思),并不意味着它提供了一个线程的入口点。 - user166390
2
相关:https://dev59.com/GnA75IYBdhLWcg3wy8Qi - BalusC
3个回答

14

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

}

实际上,没有问题,它会变得更加复杂 :-)

顺便说一句:这就是为什么你的servlet类必须是线程安全的原因!


1
此外,您是在说Servlet是单例模式,还是与容器供应商无关? - OCB
1
@Chris Boon:我非常确定它是一个单例,但我不知道容器提供者(如Tomcat)如何处理它...他们可能引入了一些“疯狂”的技巧。但是,是的,你应该将其视为单例。 - home

1
Java 中的任何类都可以在任何线程上执行,除非在运行时通过某种检查明确禁止。如果不知道 HttpServlet 的具体情况,我想您在某个地方遇到了类似于 HttpServlet 线程安全的语句。如果是这种情况,那么该类的给定实例(或该类的静态方法)可以同时从任意数量的线程中安全使用。
此外,Thread 是可运行的原因是它实现了 Runnable 接口;任何类都可以这样做。Thread 的 run() 方法的显着特点是,当启动 Thread 实例时,其 run() 方法会在单独的线程上调用。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接