# Tomcat中的线程池（APR和ThreadPool）

**URL:** <https://www.isharkfly.com/t/tomcat-apr-threadpool/9461>\
**Category:** DevOps\
**Created:** [May 5, 2015, 1:16am UTC](https://www.isharkfly.com/t/tomcat-apr-threadpool/9461 "2015-05-05T01:16:19Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [May 5, 2015, 1:16am UTC](https://www.isharkfly.com/t/tomcat-apr-threadpool/9461/1 "2015-05-05T01:16:19Z")

</div>

容器简化了程序员自身的多线程编程。

各种Web容器，如Tomcat，Resion，Jetty等都有自己的线程池（可在配置文件中配置），所以在客户端进行请求调用的时候，程序员不用针对Client的每一次请求，都新建一个线程。而容器会自动分配线程池中的线程，提高访问速度。

Tomcat线程池实现：

1、使用APR的Pool技术，使用了JNI。  
Tomcat从5.5.17开始，为了提高响应速度和效率，使用了Apache Portable Runtime(APR)作为最底层，使用了APR中包含Socket、缓冲池等多种技术，性能也提高了。APR也是Apache HTTPD的最底层。

2、使用Java实现的Thread Pool。  
ThreadPool默认创建了5个线程，保存在一个200维的线程数组中，创建时就启动了这些线程，当然在没有请求时，它们都处理“等待”状态（其实就是一个while循环，不停的等待notify）。如果有请求时，空闲线程会被唤醒执行用户的请求。

具体的请求过程是： 服务启动时，创建一个一维线程数组（maxThread＝200个），并创建空闲线程(minSpareThreads＝5个)随时等待用户请求。 当有用户请求时，调用 threadpool.runIt(ThreadPoolRunnable)方法，将一个需要执行的实例传给ThreadPool中。其中用户需要执行的 实例必须实现ThreadPoolRunnable接口。 ThreadPool 首先查找空闲的线程，如果有则用它运行要执行的ThreadPoolRunnable；

如果没有空闲线程并且没有超过maxThreads，就一次性创建 minSpareThreads个空闲线程；如果已经超过了maxThreads了，就等待空闲线程了。总之，要找到空闲的线程，以便用它执行实例。找到后，将该线程从线程数组中移走。 接着唤醒已经找到的空闲线程，用它运行执行实例（ThreadPoolRunnable）。 运行完ThreadPoolRunnable后，就将该线程重新放到线程数组中，作为空闲线程供后续使用。

由此可以看出，Tomcat的线程池实现是比较简单的，ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程，每次以一个较小步伐（5个）创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程，用完后，再“归还”给线程池。

总结：  
Tomcat5.5.10以上版本开始支持apr，支持通过apache runtime module进行JNI调用，使用本地代码来加速网络处理。

如果不使用apr之前，Tomcat的Servlet线程池使用的是阻塞IO的模式，使用apr之后，线程池变成了 NIO的非阻塞模式，而且这种NIO还是使用了操作系统的本地代码，看tomcat文档上面的说法是，极大提升web处理能力，不再需要专门放一个web server处理静态页面了。

我自己直观的感受是，不用apr之前，你配置多少个等待线程，tomcat就会启动多少个线程挂起等待，使用apr以后，不管你配置多少，就只有几个NIO调度的线程，这一点你可以通过kill -3 PID，然后察看log得知。

假设不使用apr，可能端口的线程调度能力比较差，所以通过iptables进行端口转发，让两个端口去分担一个端口的线程调度，就有可能减少线程调度的并发，从而提高处理能力，减少资源消耗。
