Tomcat 假如在未分布式情况,按照 Servlet 标准,未实现 SingleThreadModel 的 Servlet ,如果只声明一次的话,该 Servlet 在服务过程中只会有一个实例,当客户端有请求发起时, Servlet 容器会给每一个请求,从 Servlet 容器维护的线程池(具体线程个数参数配置)里面获取一个线程为其服务( BIO 模型下)。当有大量的请求发起时,线程池里面的线程可能会一下子被用完,这时候剩余请求就会被排在请求队列中(具体可以排多少个,参数配置),等有线程闲下来时继续服务排队请求,假如请求数量超过了最大的排队数,未排进队列的请求就会不予处理。
按照楼主说的, 10w 个 HTTP Request ,不会有 10w 个线程同时服务, Servlet 容器线程池配置了最多 1000 个线程,那么一瞬间这 1000 个线程将会服务于 1000 个请求,假如剩余 9000 个中 2000 个又排进了待处理队列,那么剩下的 7000 个将会不予处理,当然这是同一时间点 10w 个请求同时到达的情况。实际情况下, 10w 个请求到达时间应该有前有后,所以可能某些请求达到时,某些请求已经被迅速处理掉,线程闲下来可以继续处理了。
@
SoloCompany 想请教一下上面这段在 BIO 模型下理解是否正确,谢谢。