当前位置: 首页 > 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设备与计算机连…...

详解LinkedHashSet和LinkedHashMap

目录 一.LinkedHashSet和LinkedHashMap 1.基本介绍 2.与HashSet和HashMap的区别 3.LinkedHashSet和LinkedHashMap具体的方法 1.LinkedHashSet 2.LinkedHashMap 二.模拟代码实现LinkedHashMap 三.具体应用 一.LinkedHashSet和LinkedHashMap 1.基本介绍 顾名思义,根据名…...

C++ LinuxWebServer 2万7千字的面经长文(下)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; Linux Web Server项目虽然是现在C求职者的人手一个的项目&#xff0c;但是想要吃透这个项目&#xff0c;还是…...

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…...

ChatGPT 有哪些 “激动人心的时刻“?以及自己的一些思考

文章目录一、前言二、主要内容三、一些思考&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 近日&#xff0c;英伟达创始人兼 CEO 黄仁勋与 OpenAI 联合创始人及首席科学家伊尔亚-苏茨克维 (Ilya Sutskever) 展开了一次 “炉边谈话”。 黄仁…...

Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【手把手部署UI与动态数据】

Thingsboard开源物联网平台智慧农业实例快速部署教程&#xff08;二&#xff09;【部署UI与动态数据】 文章目录Thingsboard开源物联网平台智慧农业实例快速部署教程&#xff08;二&#xff09;【部署UI与动态数据】1. 页面总览2. 设备2.1 数据字段定义2.2 设备映射关系2.3 添加…...

Redis事务

1、事务概要 Redis事务是一个单独的隔离操作&#xff1a; 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用 串联多个命令&#xff0c;防止别的命令插队。 事务的3个命令 MultiExe…...

【蛤蟆先生去看心理医生】

第一章 整个人都不太好 人物性格描述蛤蟆热情、时尚、爱冒险&#xff0c;现在抑郁&#xff0c;不能自拔獾智慧、威严河鼠关心朋友&#xff0c;有点絮叨鼹鼠体贴善良 第二章 擎友前来相助 讲诉了鼹鼠和河鼠对蛤蟆情况的担忧和讨论。鼹鼠回忆起过去蛤蟆时髦的打扮和充满活力的生…...

JAVA开发与运维(云安全产品)

在现在的开发和运维中&#xff0c;云生态组件的使用率非常高&#xff0c;很少公司自己维护自己的物理机&#xff0c;网络流量 &#xff0c;监控&#xff0c;第三方中间件&#xff0c;除了少数涉密程度高的部分和公司外&#xff0c;大多数的企业都在使用云生态。比如我们正在开发…...

[Few-shot learning] Siamese neural networks

这篇文章主要介绍的是Siamese Neural Network经典论文&#xff1a; Gregory Koch, et al., Siamese Neural Networks for One-shot Image Recognition. ICML 2015。 神经网络能够取得非常好的效果得益于使用大量的带标签数据进行有监督学习训练。但是这样的训练方法面临两个难题…...

利用qiankun框架在自己项目中集成拖拽式低代码数据可视化开发平台

目前微前端已经是很成熟的技术了&#xff0c;各大公司都推出了自己的微前端框架&#xff0c;比如蚂蚁的qiankun&#xff0c;京东的micro-app&#xff0c;如果你的子应用不使用vite构建的话&#xff0c;我会更加推荐后者&#xff0c;micro-app使用更加简单&#xff0c;micro-app…...

兰州商城网站建设/域名停靠网页app推广大全

需要处理的返回场景&#xff1a; 1.正常的a->b->c 2.页面上的按钮触发需要登陆 3.页面跳转需要登陆 4.页面上的可修改的部分&#xff08;如选择地址&#xff0c;地址页面本身也是可以增删改查的&#xff09; 整体的原则是原路来原路回 第一个场景不需要考虑&#xff0c;h…...

微信公众号登录wordpress网站吗/怎么建立信息网站平台

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 Python数据分析 数据拷贝与备份 直接赋值、copy()与deepcopy()区别 以下python代码输出什么? import copy origin [1, [3, 4]] cop1 copy.copy(origin) cop2 copy.deepcopy(origin)…...

动态网站开发概述/软文投放平台有哪些?

partition[英][pɑ:ˈtiʃən] [美][pɑrˈtɪʃən] 简明释义n.划分&#xff0c;分开&#xff1b;分割&#xff1b;隔离物&#xff1b;隔墙 vt.分开&#xff0c;隔开&#xff1b;区分&#xff1b;分割 转载于:https://www.cnblogs.com/wwjyt/archive/2013/02/23/3153124.html...

网站logo显示/青岛谷歌优化

本文从各种角度对几个常用的 JavaScript 表格库进行比较&#xff0c;一目了然。 Feature DataTables JqGrid Slickgrid dhtmlxGrid Flexigrid ExtJs LicenseGPL v2 license or a BSD (3-point) licenseLGPLMITGrid License $449MITLicense from $600Show/Hide c…...

wordpress now 1.5/网站快速排名优化价格

转载于:https://www.cnblogs.com/gw2010/p/7892372.html...

移动端网站宽度做多大/时事新闻热点摘抄

作者简介&#xff1a; 李中凯 八年多工作经验 前端负责人&#xff0c; 擅长JavaScript/Vue。 掘金文章专栏&#xff1a;https://juejin.im/user/57c7cb8a0a2b58006b1b8666/posts 公众号&#xff1a;1024译站 Web 浏览器无疑是用户访问互联网最常见的入口。浏览器凭借其免安装和…...