Tomcat线程池原理
Tomcat 两大组件
连接器Connector 负责对外沟通 使用到了线程池
容器Container 负责实现Servlet规范
连接器 期中一部分组件NIO EndPoint的组成

- LimitLatch 用来限流,可以控制最大连接个数,类似 J.U.C 中的 Semaphore 后面再讲
- Acceptor 只负责【接收新的 socket 连接】
- Poller 只负责监听 socket channel是否有【可读的 I/O 事件】
- 一旦可读,封装一个任务对象(socketProcessor),提交给 Executor 线程池处理
- Executor 线程池中的工作线程最终负责【处理请求】
Tomcat 线程池扩展了 ThreadPoolExecutor,行为稍有不同
- 如果总线程数达到 maximumPoolSize
- 这时不会立刻抛 RejectedExecutionException 异常
- 而是再次尝试将任务放入队列,如果还失败,才抛出 RejectedExecutionException 异常

发生异常后 抓住异常 尝试使用force 方法 加入阻塞队列 还是失败 抛出异常 一定时间内重试 而且几乎只有一次机会

Tomcat线程池配置
Connector 配置

Executor 线程配置

默认是守护新城
问题:无界阻塞队列是否意味着永远无法触发救急线程?
Tomcat对 队列的做了封装 taskQueue 修改了实现

这个图好像有点问题 总之是 核心线程不够用了 先考虑创建救急线程 再考虑加入队列
浙公网安备 33010602011771号