Tomcat线程池原理

news2024/11/24 9:12:38

1. 一个 SpringBoot 项目能同时处理多少请求?tomcat容器,

200 次。

2. 怎么来的?

而点击这些线程,查看其堆栈消息,可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字
在这里插入图片描述
基于“短时间内有 200 个请求被立马处理的”这个现象,结合你背的滚瓜烂熟的、非常扎实的线程池知识,你先大胆的猜一个:Tomcat 默认核心线程数是 200。

从这个调用栈中,由于我们要找的是 Tomcat 线程池相关的源码,所以第一次出现相关关键字的地方就是这一行:

org.apache.Tomcat.util.threads.ThreadPoolExecutor.Worker#run

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
corePoolSize,核心线程数,值为 10。

maximumPoolSize,最大线程数,值为 200。

而且基于 maximumPoolSize 这个参数,你往前翻代码,会发现这个默认值就是 200:
队列长度,值为 Integer.MAX_VALUE。

在这里插入图片描述
在这里插入图片描述
这个方法里面,标号为 ① 的地方,就是判断当前工作线程数是否小于核心线程数,小于则直接调用 addWorker 方法,创建线程。

标号为 ② 的地方主要是调用了 offer 方法,看看队列里面是否还能继续添加任务。

如果不能继续添加,说明队列满了,则来到标号为 ③ 的地方,看看是否能执行 addWorker 方法,创建非核心线程,即启用最大线程数。

把这个逻辑捋顺之后,接下来我们应该去看哪部分的代码,就很清晰了。

主要就是去看 workQueue.offer(command) 这个逻辑。

如果返回 true 则表示加入到队列,返回 false 则表示启用最大线程数嘛。

这个 workQueue 是 TaskQueue,看起来一点也不眼熟:
在这里插入图片描述
当然不眼熟了,因为这个是 Tomcat 自己基于 LinkedBlockingQueue 搞的一个队列。

在这里插入图片描述

重点:题的答案就藏在 TaskQueue 的 offer 方法里面。

在这里插入图片描述
parent 就是 Tomcat 线程池,通过其 set 方法可以知道,是在线程池完成初始化之后,进行了赋值。

也就是说,你可以理解为,在 Tomcat 的场景下,parent 不会为空。

标号为 ② 的地方,调用了 getPoolSizeNoLock 方法:
就表明当前线程池的线程数已经是配置的最大线程数了,那就调用 offer 方法,把当前请求放到到队列里面去。

标号为 ③ 的地方,是判断已经提交到线程池里面待执行或者正在执行的任务个数,是否比当前线程池的线程数还少。

如果是,则说明当前线程池有空闲线程可以执行任务,则把任务放到队列里面去,就会被空闲线程给取走执行。

然后,关键的来了,标号为 ④ 的地方。

重点:如果当前线程池的线程数比线程池配置的最大线程数还少,则返回 false。

前面说了,offer 方法返回 false,会出现什么情况?
在这里插入图片描述
是不是直接开始到上图中标号为 ③ 的地方,去尝试添加非核心线程了?

也就是启用最大线程数这个配置了。

3. JDK线程池和Tomcat线程池原理不一样

JDK 的线程池,是先使用核心线程数配置,接着使用队列长度,最后再使用最大线程配置。
Tomcat 的线程池,就是先使用核心线程数配置,再使用最大线程配置,最后才使用队列长度。

https://mp.weixin.qq.com/s/PXC4pFE_ZpydBAzCJZmiqQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/848834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker中network的概要、常用命令、网络模式以及底层ip和容器映射变化的详细讲解

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…

Java课题笔记~ 关于错误与异常

非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求程序员必须处理这些异常。在运行阶段,倘若发生Error则虚拟机几乎崩溃,倘若发生RuntimeEx…

会这个Python的测试员,工作都不会太差!

Python语言得天独厚的优势使之在业界的火热程度有增无减,尤其是在经历了互联网,物联网,云计算,大数据,人工智能等浪潮的推动下,其关注度,普适度一路走高。 对于测试人员来说,很多人…

2023上半年京东吸尘器行业品牌销售排行榜(京东数据挖掘)

如今,伴随生活节奏加快、懒人经济兴起,致力于解放双手的清洁类电器产品愈加受到用户青睐。作为清洁类电器行业的细分品类之一,在懒人经济的市场红利下,吸尘器也受到不少用户的喜爱。不过在扫地机器人、洗地机等新兴品类的冲击下&a…

华三H3C S5120V3交换机的配置之组建IRF

IRF(Intelligent Resilient Framework,智能弹性架构),是华三交换机实现虚拟堆叠的一种技术,其核心思想是将多台交换机连接在一起,虚拟成一台交换机,进而实现统一管理。和传统的堆叠概念不同&…

基于连续Ziegler_Nichols的频域响应pid整定

连续Ziegler_Nichols的频域响应pid整定 Ziegler_Nichols频域响应pid整定的方法是基于稳定性分析的频域响应pid整定方法。该方法整定的思想是:对于给定的被控对象传递函数,可以得到其根轨迹,对应穿越Jw轴的点,增益即为Km&#xff…

【Java可执行命令】(二十)堆转储快照文件及堆信息查看工具 jmap:生成多格式堆转储文件、打印类加载器信息及查看共享对象映射信息 ~

Java可执行命令之jmap 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 生成堆转储文件3.3 执行jmap命令查看内存使用情况3.4 执行jmap命令打印对象统计信息 4️⃣ 应用场景🌾 总结 1️⃣ 概念 jmap 是 Java Development Kit(JDK)自带…

【Kubernetes】Kubernetes之YAML文件详解

YAML 一、YAML 的概述1. Kubernetes 支持资源管理格式2. YAML 语法格式 二、YAML 文件1. 如何获取 api 资源相关信息2. 编写资源配置文件2.1 手动编写 yaml 文件详解K8S中的port 2.2 使用镜像生成 yaml 文件2.3 根据现有资源导出 yaml 文件 总结1. 如何获取资源清单文件&#x…

[LeetCode - Python]349. 两个数组的交集(Easy);350. 两个数组的交集 II(Easy)

题目: 349. 两个数组的交集(Easy) 代码 1.哈希表 set清重 两次遍历: class Solution:def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:dict {}ret []for i in set(nums1) :if i not in dict:dict[i] 0 for j in …

selenium+python —— 实现基本自动化测试

安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回…

centos7 ESXi 磁盘扩充容量

1、背景 有一天,突然程序报空间不足了。。。。。。 2023-06-23 02:26:51.631 UTC [26190] LOG: could not open temporary statistics file "pg_stat_tmp/global.tmp": No space left on device 2023-06-23 02:26:51.631 UTC [26190] LOG: could not …

恒运资本:2倍牛股突然闪崩,业绩创新高股出炉,最高日赚近2亿

上半年哪些公司净利润有望创前史新高? 2倍牛股单季成绩环比下滑,早盘股价大跳水 A股半年报进入发表高峰期,仅8月7日晚间,就有超30家公司发表半年报和成绩预告状况,超七成净利润同比增加。净利润增速最高的是翔港科技&…

基于Spring Boot的影视点播网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的影视点播网站设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java springboot…

Flowable-多实例

目录 概述概念多实例配置图形标记XML内容界面操作视频教程 BPMN2.0 中引入了多实例的概念,它是在业务流程中定义“重复”环节的一个方法,Flowable 对其予以了支持。配置为多实例的活动在流程运行时会创建多个活动实例,既可以顺序依次执行也 可…

海外市场裂变营销:打造爆炸式增长的成功之道

随着全球化的加速发展,越来越多的品牌开始将目光投向海外市场。然而,在激烈的国际竞争中脱颖而出,并在海外市场取得成功并不容易。在这样的背景下,裂变营销成为了一个备受关注的策略,它能够帮助品牌在海外市场快速拓展…

vue3 excel 导出功能

1.安装 xlsx 库 npm install xlsx2.创建导出函数 src/utils/excelUtils.js import * as XLSX from xlsx;const exportToExcel (fileName, datas, sheetNames) > {// 创建工作簿const wb XLSX.utils.book_new()for (let i 0; i < datas.length; i) {let data datas…

教雅川学缠论06-中枢

本系列文章之前讲的内容都只有上升和下降两类趋势&#xff0c;并没有提及盘整&#xff0c;在缠论中&#xff0c;中枢这个新词汇用来定义盘整&#xff0c;中枢&#xff1a; 1.至少由5条线段&#xff08;或笔&#xff09;组成 2.中枢是有方向的&#xff0c;中枢左右两侧外面的线&…

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指&#xff0c;系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时&#xff0c;必须首先输出到缓冲区中。待缓冲区装满后&#xff0c;再一起输出到磁盘文件中。 从磁盘文件向内…

lz4 与 lz77 压缩算法举例

lz4算法 abcd efab cdeh 压缩过程&#xff1a; 以长度&#xff14;为滑窗&#xff0c;&#xff11;为步长&#xff0c;对abcd计算hash存入hash table&#xff0c;计算 bcde, cdef,defa,efab,fabc的 hash 分别加入 hash table&#xff0c;下一个滑窗 abcd 找到了匹配&#xf…

Acwing.883 高斯消元解线性方程组

题目 输入一个包含n个方程n个未知数的线性方程组。 方程组中的系数为实数。 求解这个方程组。 下图为一个包含m个方程n个未知数的线性方程组示例: 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含n1个实数&#xff0c;表示一个方程的n个系数以及等号右侧的常数。 …