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

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是如何启动的

相关文章:

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

tomcat两大组件&#xff1a;连接器Connector&#xff0c;容器Container tomcat线程池 Tomcat线程池扩展了ThreadPoolExecutor&#xff0c;行为稍有不同 重写了ThreadPoolExecutor的execute方法 如果总线程数达到maximumPoolSize&#xff0c;不会立刻抛RejectedExecutionExcept…...

第十四届中国大学生创新创业大赛

文章目录比赛官网比赛题目含金量非常高建议参加的学生推荐几个我感兴趣的题目联系比赛官网 官网地址&#xff1a;http://www.fwwb.org.cn/ 实际叫做&#xff1a;中国大学生创新创业大赛 比赛题目 题目公布查看地址&#xff1a;http://www.fwwb.org.cn/topic/index 题目有…...

LeetCode:322. 零钱兑换——动态规划从案例入门

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;322. 零钱兑换 题目描述&#xff1a;给你一个整数数组coins&#xff0c;…...

【lwIP(第四章)】网络接口

目录一、lwIP网络接口简介二、lwIP的netif结构三、lwIP的netif相关函数1. lwIP网络接口的全局变量2. netif_add()函数3. netif_remove()函数4. netif_set_default()函数一、lwIP网络接口简介 lwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#xff0c;由于网卡…...

Vue3 pinia入门篇(一)

系列文章目录 主要为了记录如何使用Pinia在Vue3中的使用方式&#xff08;下面会介绍为什么使用Vue3选型&#xff09; 文章目录系列文章目录不用Vue2使用Pinia举例子&#xff1f;1.笔者的个人看法&#xff1a;2.总结一、Pinia是什么1.状态管理工具&#xff08;类比Vuex&#xff…...

python面向对象编程解释

python是一个面向对象的编程语言 面向过程的开发语言有C&#xff0c;面向对象除了python还有java等语言 具体来讲&#xff1a; 面向过程 &#xff1a;举个例子&#xff0c;比如说&#xff0c;把大象装进冰箱总共分几步&#xff0c;第一步&#xff0c;把冰箱门打开&#xff0c…...

ARM(IMX6U)嵌入式软件裸机开发之环境搭建与配置

目录 前沿 Ubuntu 和 Windows 文件互传 Ubuntu 下 NFS 和 SSH 服务开启 Ubuntu 交叉编译工具链安装 Source Insight 软件安装和使用 Visual Studio Code 软件的安装和使用 前沿 为什么我们要学习裸机开发呢&#xff1f; 1、裸机开发是了解所使用的 CPU 最直接、最简单的方…...

Java文件复制多种方法

1、InputStream与OutputStream 创建两个文件 - 源和目标。然后我们从源创建InputStream并使用OutputStream将其写入目标文件进行 java 复制文件操作。 private static void copyFileUsingStream(File source, File dest) throws IOException {InputStream is null;OutputStr…...

Java语言-----封装、继承、抽象、多态、接口

目录 前言 一.封装 1.1封装的定义 1.2访问修饰符的使用 二.继承 2.1继承的定义 2.2继承的方法 2.3继承使用注意点 三.多态 3,1多态的定义 3.2动态绑定 3.3方法重写 3.4向上&#xff08;向下&#xff09;转型 四.抽象 4.1抽象的概述和定义 4.2抽象的使用 五…...

基于深度学习的瓶子检测软件(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;基于深度学习的瓶子检测软件用于自动化瓶子检测与识别&#xff0c;对于各种场景下的塑料瓶、玻璃瓶等进行检测并计数&#xff0c;辅助计算机瓶子生产回收等工序。本文详细介绍深度学习的瓶子检测软件&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的…...

仿网易云小程序(一)

目录 一、项目准备 二、项目初始化 1.新建项目 2.封装service请求 三、底部导航栏的设计 四、MV页面的设计 1.将获取到的数据进行渲染 2.播放量数据进行处理转换 3.时长数据进行处理转换 五、MV组件的抽离封装 六、请求的抽离video 七、下拉重新请求新的数据 八、跳转到…...

【C++】vector模拟实现及其应用

文章目录vector的介绍vector的使用及其实现vector的定义vector iterator 的使用vector空间增长问题vector的增删查改vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素…...

JS看这一篇就够啦,JS基础大全,可用于快速回顾知识,面试首选

1 JS简介 更多JS内容可以看MDN&#xff1a;点击传送 浏览器分成两部分&#xff1a;渲染引擎和 JS 引擎 渲染引擎&#xff1a;用来解析HTML与CSS&#xff0c;俗称内核&#xff0c;比如 chrome 浏览器的 blink &#xff0c;老版本的 webkitJS 引擎&#xff1a;也称为 JS 解释器…...

武汉凯迪正大GB4208外壳防护等级试具

一、IP1X 试验探棒 产品概述&#xff1a; 符合IEC61032图1试具A、GB16842试具A、GB4208IP1、IEC60529IP1、IEC60065 等标准要求。用于防止手背触及的防护检验。 技术参数&#xff1a; 1、探球直径&#xff1a;50mm 2、挡板直径&#xff1a;45mm 3、挡板厚度&#xff1a;…...

Cent OS 从零部署ruoyi-cloud教程

1、java环境安装 https://blog.csdn.net/m0_61035257/article/details/125705400 Java_home设置 https://blog.csdn.net/m0_51104427/article/details/123924893 2、mysql安装 https://blog.csdn.net/ShockChen7/article/details/126965940 若安装的是Mysql8&#xff0c;建议…...

ChatGPT相关核心算法

ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…...

Python导入模块,Python import用法(超级详细)

使用 Python 进行编程时&#xff0c;有些功能没必须自己实现&#xff0c;可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说&#xff0c;在前面章节中&#xff0c;我们使用了一些数学函数&#xff0c;例如余弦函数 cos()、绝对值函数 fabs() 等&#xff0c;它们位…...

大量产品“GPT 化”,开源大模型 AI 应用开发框架发布

大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;让我们看到了 AI 在自然语言处理方面的潜力&#xff0c;它涌现出来的创造力和思维能力令人叹为观止&#xff0c;并在新一代人机交互领域释放了大量的想象空间。 目前&#xff0c;决策者、产品负责人和开发者都在抢滩…...

STM32——IIC总线(MPU6050应用)

目录 一、IIC介绍 二、MPU6050 三、MPU6050实例 四、EEPROM ---------------------------------------------------------------------------------------------------------------------------- 每次都是IIC好没新意啊&#xff0c;我决定这次录视频的时候举两个例子&…...

ADB使用经验

adb是Android Debug Bridge的缩写&#xff0c;是一种用于与Android设备通信的命令行工具。它可以通过USB连接或Wi-Fi连接&#xff0c;允许开发者在计算机和Android设备之间进行文件传输、安装应用程序、调试应用程序等操作。要使用adb&#xff0c;需要先将Android设备与计算机连…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

RK3568项目(七)--uboot系统之外设与PMIC详解

目录 一、引言 二、按键 ------>2.1、按键种类 ------------>2.1.1、RESET ------------>2.1.2、UPDATE ------------>2.1.3、PWRON 部分 ------------>2.1.4、RK809 PMIC ------------>2.1.5、ADC按键 ------------>2.1.6、ADC按键驱动 ------…...