当前位置: 首页 > article >正文

tomcat线程池以及在SpringBoot中的启动过程

tomcat两大组件:连接器Connector,容器Container

tomcat线程池

在这里插入图片描述
Tomcat线程池扩展了ThreadPoolExecutor,行为稍有不同
重写了ThreadPoolExecutor的execute方法
如果总线程数达到maximumPoolSize,不会立刻抛RejectedExecutionException异常
而是再次尝试将任务放入队列,如果还失败,才抛出RejectedExecutionException异常

tomcat线程池相关的配置

Connector配置,对应server.xml中的Connector标签

acceptor线程数量(建立socket连接,这个线程很多时候在阻塞状态,没有新的连接就会等待,所以1个线程足够了)->acceptorThreadCount(default 1)
poller线程数量(采用了多路复用的思想,1个线程就能监测多个channel的读写事件)->pollerThreadCount(default 1)
Executor线程池中的核心线程数->minSpareThreads(default 10)
Executor线程池中的最大线程数->maxThreads(default 200)
Executor名称(引用Executor标签)->会覆盖掉minSpareThreads和maxThreads的值

Executor线程配置,对应server.xml中的Executor标签

线程优先级 -> threadPriority(default 5)
是否守护线程 -> daemon(default true)
核心线程数 -> minSpareThreads(default 25)
最大线程数 -> maxThreads(default 200)
非核心线程空闲生存时间 -> maxIdleTime(default 60000)1分钟
队列长度 -> maxQueueSize(default Integer.MAX_VALUE)
核心线程是否在服务器启动时启动 -> prestartminSpareThreads(default false)

核心类
org.apache.catalina.startup.Catalina#createStartDigester方法解析server.xml标签
Executor标签默认使用的这个StandardThreadExecutor:启动核心,方法startInternal,execute
但是SpringBoot中好像没用这个StandardThreadExecutor
tomcat中有一个同名的ThreadPoolExecutor继承了JDK的ThreadPoolExecutor

// TaskQueue是Tomcat中的任务队列
// org.apache.tomcat.util.threads.TaskQueue.java
// public class TaskQueue extends LinkedBlockingQueue<Runnable>

// 线程池中的线程数 < 核心线程数时,会直接创建新线程执行该任务
// calling this method when 线程池中的线程数 >= 核心线程数
// TaskQueue重写了offer方法
public boolean offer(Runnable o) {
    if (this.parent == null) {
        return super.offer(o);
        // 线程池中的线程数 == 最大线程数
    } else if (this.parent.getPoolSize() == this.parent.getMaximumPoolSize()) {
        return super.offer(o);
        // 线程池中的线程数 >= 队列里的任务和已经在执行但是还没执行完的任务
    } else if (this.parent.getSubmittedCount() <= this.parent.getPoolSize()) {
        return super.offer(o);
    } else {
    	// 线程池中的线程数 < 最大线程数(此时会返回false,导致execute方法中调用addWorker方法创建一个线程)
        return this.parent.getPoolSize() < this.parent.getMaximumPoolSize() ? false : super.offer(o);
    }
}

SpringBoot启动时,Tomcat启动的过程:从Spring的run方法开始,一些关键节点

TomcatWebServer.class:185
WebServerStartStopLifecycle.class:22
DefaultLifecycleProcessor.class:123
DefaultLifecycleProcessor.class:294
DefaultLifecycleProcessor.class:100
DefaultLifecycleProcessor.class:74
AbstractApplicationContext.class:527
AbstractApplicationContext.class:296
TomcatWebServer.class:167
TomcatWebServer.class:166
TomcatWebServer.class:83
TomcatWebServer.class:75
TomcatWebServer.class:60
TomcatServletWebServerFactory.class:409
TomcatServletWebServerFactory.class:145
TomcatServletWebServerFactory.class:127
ServletWebServerApplicationContext.class:102
ServletWebServerApplicationContext.class:81
AbstractApplicationContext.class:293
AbstractApplicationContext.class:279
SpringApplication.class:493
SpringApplication.class:268
SpringApplication.class:171
WeiXinApplication.java:13

在这里插入图片描述
tomcat的线程池机制
Tomcat线程池原理
Executor官方配置文档
tomcat-超详细的启动流程
SpringBoot启动流程之tomcat启动流程
SpringBoot中Tomcat是如何启动的


http://www.kler.cn/a/3967.html

相关文章:

  • 【专题二 二叉树中的深搜】98. 验证二叉搜索树
  • 常见的两种虚拟化技术比较:KVM与VMware
  • 基于本地消息表实现分布式事务
  • 力扣9-找出字符串中第一个匹配项的下标
  • AI-Talk开发板之替换唤醒词
  • Formality:参考设计/实现设计以及顶层设计
  • 11万字数字政府智慧政务大数据建设平台(大数据底座、数据治理)
  • python带你成功复刻热门手机游戏——飞翔的小鸟
  • 代码随想录刷题-哈希表总结篇
  • 网络爬虫抓包工具
  • 网络基础认识
  • KSS-ICP: 基于形状分析技术的点云配准方法
  • macOS Big Sur 11.7.5 (20G1225) 正式版 ISO、PKG、DMG、IPSW 下载
  • Java文件复制多种方法
  • Java中Static关键字的五种用法详解
  • RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类
  • 网络技术这十个术语你知道吗?
  • HTML 标签和属性
  • 基于Java+Springboot+vue的幼儿园管理系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】
  • ADC选型关注的参数
  • HTTPS的加密流程
  • 个推携手中国信通院举办“APP开发者个人信息保护培训宣讲会”
  • 首个ChatGPT开发的应用上线;ChatMind思维导图工具;中文提示词大全;Copilot平替 | ShowMeAI日报
  • 免费1年服务器,部署个ChatGPT专属网页版
  • 免费ChatGPT自动批量生成文章工具
  • Java泛型