对于一个可运行的对象,它需要实现Runnable
接口或扩展Thread
类,但是HttpServlet
似乎不会执行任何这些。
为什么HttpServlet
可以被线程化或者我弄错了?
答案 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本身不是线程,但它们在多线程环境中运行,因此它们是线程化的。