作者:孙鑫  来源: 程序员之家   www.phome.asia
Servlet规范定义,在默认情况下(Servlet不是在分布式的环境中部署),Servlet容器对声明的每一个Servlet,只创建一个实例。如果有多个客户请求同时访问这个Servlet,Servlet容器如何处理这多个请求呢?答案是采用多线程,Servlet容器维护了一个线程池来服务请求。 线程池实际上是等待执行代码的一组线程,这些线程叫做工作者线程( Worker Thread )。Servlet 容器使用一个调度者线程(Dispatcher Thread )来管理工作者线程。当容器接收到一个访问Servlet的请求,调度者线程从线程池中选取一个工作者线程,将请求传递给该线程,然后由这个线程执行Servlet的service()方法,如图7-1所示。
7-1  调度者线程选取一个工作者线程来服务请求
    当这个线程正在执行的时候,容器收到了另外一个请求,调度者线程将从池中选取另一个线程来服务新的请求。要注意的是,Servlet容器并不关心这第二个请求是访问同一个Servlet还是另一个Servlet。因此,如果容器同时收到访问同一个Servlet的多个请求,那么这个Servlet的service()方法将在多个线程中并发的执行。图7-2显示了两个工作者线程都在执行同一个Servlet的service()方法。
由于Servlet容器采用了单实例多线程的方式(这是Servlet容器默认的行为),最大限度地减少了产生Servlet实例的开销,显著地提升了对请求的响应时间。对于Tomcat,可以在server.xml文件中通过<Connnector>元素设置线程池中线程的数目.