一个对象要能够运行,它需要实现 Runnable
接口或继承 Thread
类,然而,似乎 HttpServlet
都没有做到这些。
那么,为什么 HttpServlet
可以被线程化或者我弄错了吗?
一个对象要能够运行,它需要实现 Runnable
接口或继承 Thread
类,然而,似乎 HttpServlet
都没有做到这些。
那么,为什么 HttpServlet
可以被线程化或者我弄错了吗?
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类必须是线程安全的原因!
任何东西都可以线程化。Spring Bean的EJB本身不是线程,但它们在多线程环境中运行,因此它们是可线程化的。