---
title: Tomcat 线程池的扩容与排队策略
date: '2014-10-08 10:40:20'
draft: false
summary: Tomcat 线程池并不只是简单排队，它通过 TaskQueue 改写了行为，整体上更偏向先扩 worker 再排队。
slug: tomcat-prefers-growing-workers-before-queueing
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/BqA1p1TVC
tags:
- tomcat
- thread-pool
- java
- web-server
topics:
- software-engineering
type: post
---

很多人讲 `Tomcat` 线程池时，会直接把它等同于一个普通的 `ThreadPoolExecutor`，但这个理解其实不够准确。

`Tomcat` 真正用来处理这类场景的，是 `StandardThreadExecutor`。更关键的是，它还通过自定义的 `TaskQueue` 对默认线程池行为做了一层包装。

这个包装带来的核心效果是：它并不是一上来就把任务往等待队列里塞，而是会优先尝试继续增加 `worker` 线程，直到接近上限之后，才开始更明显地依赖队列。

这种策略对 Web 场景其实很自然。因为请求流量通常有明显突发性，如果太早进入排队，响应延迟会更容易被放大；而先扩 `worker`，至少能让系统在短时波峰里多吃下一些并发。

当然，这也不是没有代价。线程涨得更激进，意味着上下文切换和资源占用也会更敏感。所以关键不是简单说“Tomcat 用了线程池”，而是要看它到底把“扩线程”和“排队”这两个动作放在什么优先级上。
