apache http server 不使用 java worker 模型,而是 c 实现的多进程/多线程模型;所谓“java 中 apache 的 worker 模型”实指 tomcat 线程池或 httpclient 连接池机制,二者分别负责请求处理与连接复用,需协同配置才能实现高并发低开销。
apache http server 本身不直接使用 java 的 worker 模型,它用的是 c 实现的多进程/多线程模型(如 prefork、worker、event mpm)。而“java 中 apache 的 worker 模型”这一说法容易引起混淆——实际中,常指 apache tomcat(由 apache 软件基金会维护的 java servlet 容器)中的线程模型,或 apache httpclient(java 客户端库)中对连接池与执行线程的协同管理。
Tomcat 的线程模型(即常说的“Worker 线程池”)
Tomcat 使用 Executor 配置线程池来处理请求,每个请求由一个工作线程(Worker Thread)执行。该模型本身不直接管理 HTTP 连接的持久化,但与底层协议(如 HTTP/1.1 的 keep-alive)配合可复用 TCP 连接。
- 在
server.xml中配置<executor></executor>定义核心线程数、最大线程数等,例如: - Connector(如 HTTP/1.1 或 AJP)需启用 keep-alive:默认已开启,可通过
keepAliveTimeout和maxKeepAliveRequests控制持续时间和请求数。 - 注意:线程池负责“处理请求”,而连接复用由网络层(Socket 层 + HTTP 协议层)维持;二者协同才能实现高并发下的低连接开销。
HttpClient 与持久化连接池的结合
Apache HttpClient 是 Java 应用中常用 HTTP 客户端,其 ConnectionPool(如 PoolingHttpClientConnectionManager)天然支持持久化连接(HTTP Keep-Alive),并可与自定义线程池(如 ExecutorService)配合实现并发请求调度。
- 创建带连接池的客户端时,需显式设置最大总连接数和每个路由最大连接数:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(20); - 使用
CloseableHttpClient发起请求时,连接在响应消费完毕且未显式关闭时自动归还到池中,供后续请求复用。 - 若业务使用多线程并发调用(如定时任务、异步服务编排),建议将 HttpClient 实例设为单例,并搭配线程安全的连接池;避免每个线程新建 client,否则连接无法复用,还会耗尽资源。
常见误区与关键点
很多人误以为“配置了线程池就等于启用了持久连接”,其实二者作用域不同:Worker 线程解决的是“谁来干活”,连接池解决的是“TCP 连接能不能重复用”。只有两者正确配合,才能真正降低延迟、提升吞吐。
- Tomcat 作为服务端,要确保客户端(浏览器或 HttpClient)发送
Connection: keep-alive,且自身未禁用 keep-alive(检查disableKeepAlivePercentage等参数)。 - HttpClient 作为客户端,必须消费完整响应体(如调用
entity.getContent().close()或使用try-with-resources),否则连接不会释放回池。 - HTTPS 场景下,连接复用还受 SSL Session 复用影响,需确认 JVM 和目标服务端均支持 TLS session resumption。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










