10.2 线程池

第 9 章深入介绍了线程池。Java EE 服务器则扩展了线程池的使用,同时第 9 章所介绍的关于如何正确调整线程池大小的所有内容也都适用于应用服务器。

应用服务器通常不只有一个线程池。一个线程池通常用来处理 servlet 的请求,另一个则用来处理远程 EJB 的请求,第三个则可以处理 Java Message Service(JMS)请求。也有些应用服务器允许每类请求可以有多个线程池:比如,同样是 servlet 请求,但 URL 不同,可以由单独的线程池处理,或同样是远程 EJB 请求,但调用的 EJB 不同,也可以由单独的线程池处理。

应用服务器中的线程池可以依据不同的请求量分成若干优先级。以运行在四 CPU 机器上的应用服务器为例,假设它的 HTTP 线程池有 12 个线程,EJB 线程池有 4 个。所有线程都会争抢 CPU,但当所有线程都跑满的时候,servlet 请求使用 CPU 的机会比 EJB 请求多两倍。实际上 servlet 线程池的优先级为 3x。

不过这里也有些限制。这些线程池没有办法单独设置,所以只有在没有待处理的 servlet 请求时,才会处理 EJB 请求。只要 EJB 线程池中还有可用线程,这些线程就会共同争用 CPU,无论 servlet 线程池有多忙。

类似地,当服务器因为其他原因空闲时,也请注意,不要将线程池的大小设置成低于预期的工作负荷。如果四 CPU 机器的 JMS 池只配置 3 个线程,那只处理 JMS 请求的话就无法充分利用 CPU。为了弥补这样的浪费,所有线程池的大小都能相应增大,不过这可能会使你的机器运行了太多的线程,从而加重计算机的负担。

因此,这种调整不太靠谱,并且取决于你的应用服务器是否有一个好的流量模型。它有助 于让你应用的性能百尺竿头更进一步。