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

Tomcat线程池原理

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

相关文章:

Tomcat线程池原理

1. 一个 SpringBoot 项目能同时处理多少请求?tomcat容器, 200 次。 2. 怎么来的? 而点击这些线程,查看其堆栈消息,可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理…...

踩坑 视觉SLAM 十四讲第二版 ch13 编译及运行问题

一、安装Geset 库 sudo apt-get install libgtest-dev cd /usr/src/gtest sudo mkdir build cd build sudo cmake .. //一定要以sudo的方式运行,否则没有写入权限 sudo make //这个也一样要以sudo的方式 sudo cp libgtest*.a /usr/local/lib //将生成…...

【设计模式】-装饰器模式

Java 设计模式之装饰器模式 前言 在软件开发中,经常有需求对已有的对象进行功能的扩展,但是传统的继承方式会导致类的数量快速增多,且难以维护。为了解决这个问题,装饰器模式应运而生。 装饰器模式是一种结构型设计模式&#xff…...

七月学习总结

一晃暑期七月份已经结束了,八月份需要做的事情更多。 在成长的路上不断地迷茫,不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发,往架构方向做,主语言Java或者go,408基础一定要扎实,计…...

Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…...

Kubernetes —调度器配置

目录 配置文件 扩展点 调度插件 多配置文件 应用于多个扩展点的插件 调度程序配置迁移 你可以通过编写配置文件,并将其路径传给 kube-scheduler 的命令行参数,定制 kube-scheduler 的行为。 调度模板(Profile)允许你配置 k…...

【微信小程序】申请蓝牙、位置和数据库等相关权限

在小程序的app.json文件中配置requiredPermissions字段,并在其中添加相应的权限。 以下是一个示例app.json文件的配置,包括了蓝牙、位置和数据库等权限的申请: {"pages": ["pages/index/index"],"requiredPermiss…...

ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic

文章目录 0 引言1 D435i相机配置2 新增发布双目位姿功能2.1 新增d435i_stereo.cc代码2.2 修改CMakeLists.txt2.3 新增配置文件D435i.yaml 3 编译运行和结果3.1 编译运行3.2 结果3.3 可能出现的问题 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地&#xff0c…...

【数据结构与算法——TypeScript】哈希表

【数据结构与算法——TypeScript】 哈希表(HashTable) 哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。通过实现来理解哈希表背后的原理…...

JavaScript 中常用简写语法技巧总结

分享一些自己常用的js简写技巧,长期更新,会着重挑选一些实用的简写技巧,使自己的代码更简洁优雅~ 这里只会收集一些大多数人不知道的用法,但是确实能提高自己的编码技巧,像ES6那些基础的简写语法或者是三目运算符代替i…...

漫画算法做题笔记

诸神缄默不语-个人CSDN博文目录 哦这是我三年前写的,我现在Java语法都快忘光了…… 反正之前的博文也发一下好了。这个因为我当年是用有道云笔记而不是直接用CSDN编辑器写的,所以后面有些内容写乱了,因为我现在猛的一看有点看不懂&#xff0…...

JDBC学习笔记

1 JDBC简介 1.1 前言 当谈论JDBC时,我们可以将其看作是一种用于Java程序与数据库进行通信的方式。如果你想编写一个Java程序,并且希望能够连接到数据 库、执行查询或更新数据,JDBC就是你需要的工具。 JDBC提供了一组类和接口,…...

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证,联合方案带来约20%性能提升

近日,亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试,亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外,双方进一步开展TP…...

【MySQL】基础知识(一)

MySQL基础知识(一) 文章目录 MySQL基础知识(一)00 MySQL安装01 数据库介绍1.1 什么是数据库1.2数据库分类 02 SQL分类03 数据库操作3.1显示数据库3.2创建数据库3.3选中数据库3.4删除数据库 04 常用数据类型4.1数值类型4.2字符串类…...

Ansible专栏目录

我的博客:www.itwk.cc 希望能够给大家带来帮助! 1、什么是Ansible?Ansible 简介及核心概念详解 https://blog.csdn.net/qq_34185638/article/details/131079320 2、Ansible Inventory 主机清单的作用、使用方法及示例详解 https://blog.cs…...

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点(golang/boomer) 问题 资料获取方法 背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能…...

亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长,从养宠意愿的转化到养宠生活的需求,多层次的需求推动行业发展新趋势 从需求端进行分析,可以将养宠意愿的转化分为三个层…...

时序数据库 TDengine 与 WhaleStudio 完成相互兼容性测试认证

近年来,开源及其价值获得社会各界的广泛认可,无论是国家政策导向还是企业数字化转型,都在加速拥抱开源。对于如操作系统、数据库等基础软件来说,开源更是成为驱动技术创新的有力途径。 在此背景下,近日,涛…...

Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标 前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、…...

负载均衡–HAProxy安装及搭建tidb数据库负载服务

作为一名开发人员,随着经验的增加和技术的沉淀,需要提高自己架构方面的知识,同时对于一个企业来说,搭建一套高可用、高性能的技术架构,对于公司的业务开展和提高服务的性能也是大有裨益的。本文重点从软件安装和搭建ti…...

书匠策AI实测揭秘:毕业论文全流程竟然能这样“偷懒“?

各位同学,我是一个专门教别人写论文的博主。说实话,每次看到评论区有人问"论文到底怎么开头",我都想穿越屏幕去帮他敲键盘。 但今天不一样,我要给你们安利一个我自己偷偷用了好几次的工具——书匠策AI。注意&#xff0…...

BGA翻新安全的核心风险—热损伤与机械失效底层逻辑

BGA(球栅阵列)芯片翻新是电子制造业降本增效、资源循环的重要工艺,广泛应用于服务器 CPU、手机基带芯片、车载处理器等高价值元器件修复场景。但 BGA 封装结构精密,焊点隐藏在芯片底部,翻新过程需经历多次高温加热、机…...

Codeforces Round 1056

憧憬成为 Master 第 27 集 —— 罚时上天 (Codeforces Round 1056 (Div. 2)) https://www.bilibili.com/video/BV18QxuzfEXx/ 【赛时5/6题】Codeforces Round 1056 (Div.2) https://www.bilibili.com/video/BV1Q9xuztEAo/ Codeforces Round 1056 拼好饭题解 https://www.bilibi…...

告别传统菜单!用SARibbon库为你的Qt应用打造Office风格界面(附高分屏适配)

告别传统菜单!用SARibbon库为你的Qt应用打造Office风格界面(附高分屏适配) 当用户第一次打开你的Qt应用时,第一印象往往决定了他们是否会继续使用。传统的菜单栏界面在2023年看起来已经过时,而类似Office的Ribbon界面则…...

别再只画图了!深度解读R语言列线图结果:如何从lrm模型输出看懂每个变量的影响大小?

从模型输出到临床洞察:R语言列线图结果深度解析指南 当你第一次看到lrm模型输出的那堆"Effects"和"Odds Ratio"时,是不是感觉像在解读外星文?别担心,这正是从"会画图"到"懂原理"的必经之…...

c# while循环 do while循环

while循环//while循环 //while(){}:当小括号条件成立 执行{}里面的东西,条件不成立的时候,循环就结束了while (true) //true 就是永远成立 一直执行{} {Console.WriteLine("死循环");break; //跳出死循环 只会执行一次 }while (tru…...

如何通过精细风扇控制优化Windows电脑的散热与静音体验

如何通过精细风扇控制优化Windows电脑的散热与静音体验 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanContro…...

Godot RL Agents实战:游戏开发者可用的轻量强化学习落地方案

1. 这不是“又一个强化学习教程”,而是给游戏开发者准备的RL落地切口你有没有过这样的经历:在GitHub上看到一个标着“Godot RL”的仓库,点进去发现README里全是PyTorch张量形状、Gymnasium环境注册、PPO超参数表格,再往下翻是几行…...

KMS_VL_ALL_AIO:告别激活烦恼的完整解决方案指南

KMS_VL_ALL_AIO:告别激活烦恼的完整解决方案指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为了激活Windows系统而花费数小时研究复杂的命令行?或者面对O…...

Unity串口通信实战:线程安全与跨平台解决方案

1. 这不是“调个串口”那么简单:Unity里做串口通信的真实战场很多人第一次在Unity里尝试串口通信,是被一个硬件交互需求推着走的——比如要读取温湿度传感器数据、控制步进电机转速、或者让Arduino小车响应Unity场景里的按钮点击。他们搜到“Unity 串口 …...