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 修改了实现
这个图好像有点问题 总之是 核心线程不够用了 先考虑创建救急线程 再考虑加入队列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)