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  修改了实现

 

 

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

 

posted @ 2022-03-27 09:26  贪、欢  阅读(278)  评论(0)    收藏  举报