学习分享-Tomcat 的线程池在工作方式上与普通的 Java 线程池的区别

前言

最近在学习过程中遇到在某个场景下:修改某条数据时,给该线程上分布式写锁,然后引入延迟队列处理其他请求;这个方案有一定的缺点,因为在用到消息队列时,不存在占用过多线程从而导致OOM的问题,消费者组只会安排固定的几个线程去拉取消息,如果碰到上面那种拿不到锁的情况,阻塞等待就好。
上面这个场景设计到了Tomcat 的线程池,因此做一些分享。
Tomcat 的线程池在工作方式上有一些不同于普通的 Java 线程池 (如 ThreadPoolExecutor) 的地方,尤其是在处理线程的创建和任务的排队方面。

普通线程池(ThreadPoolExecutor)的工作方式

普通的 Java 线程池 (ThreadPoolExecutor) 按以下顺序处理任务:

  1. 核心线程:首先会创建和使用核心线程来处理任务,直到核心线程数达到 corePoolSize
  2. 阻塞队列:如果核心线程都在忙,并且有新的任务进来,任务会被放入阻塞队列(workQueue)中。
  3. 最大线程数:如果阻塞队列满了,并且还有新的任务,线程池会创建新的线程,直到线程总数达到 maximumPoolSize
  4. 拒绝策略:如果线程总数已经达到了 maximumPoolSize,并且阻塞队列也满了,新来的任务会根据拒绝策略(RejectedExecutionHandler)来处理。

Tomcat 线程池的工作方式

Tomcat 使用了一个自定义的线程池实现,它在处理请求时的行为与普通线程池有一些不同:

  1. 核心线程与最大线程:Tomcat 线程池中的 maxThreads 参数对应于普通线程池中的 maximumPoolSize,而 minSpareThreads 参数则与 corePoolSize 类似,但有一些不同。
  2. 直接创建新线程:Tomcat 在线程创建方面更加激进,当有新的请求进来时,如果所有当前线程都在忙,它会立即尝试创建新的线程,直到达到 maxThreads 数量。
  3. 任务队列:Tomcat 也有一个任务队列(acceptCount),但它的作用是当所有 maxThreads 都在忙时,用于排队等待处理的请求数量。如果这个队列也满了,新的请求会被拒绝或连接被关闭。
  4. 线程回收:Tomcat 会回收空闲的线程,保持至少 minSpareThreads 数量的线程处于空闲状态以便应对新的请求。

具体的区别

  • 线程创建时机

    • 普通线程池:先使用核心线程,然后任务进入队列,再创建额外线程。
    • Tomcat 线程池:在核心线程忙时,会直接创建新的线程直到 maxThreads
  • 队列的使用

    • 普通线程池:核心线程忙时,任务排队,队列满时才创建新的线程。
    • Tomcat 线程池:在所有线程都忙时,任务才进入队列。
  • 参数配置

    • 普通线程池:corePoolSize, maximumPoolSize, keepAliveTime, workQueue
    • Tomcat 线程池:maxThreads, minSpareThreads, acceptCount 等。

示例

普通线程池(ThreadPoolExecutor)示例
ExecutorService executorService = new ThreadPoolExecutor(10, // corePoolSize20, // maximumPoolSize60L, // keepAliveTimeTimeUnit.SECONDS, // unitnew LinkedBlockingQueue<Runnable>(100) // workQueue
);
Tomcat 线程池配置示例(在server.xml中)
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxThreads="200"minSpareThreads="25"acceptCount="100"maxConnections="5000"/>

在这个配置中:

  • maxThreads:最大线程数,表示 Tomcat 能够创建的最大工作线程数(类似于 maximumPoolSize)。
  • minSpareThreads:最小空闲线程数,即使没有请求,Tomcat 也会保持的空闲线程数。
  • acceptCount:最大排队请求数,当所有线程都在忙时,新的请求会进入这个队列。

总结

  • 普通线程池:主要通过核心线程处理任务,队列排队,最后才扩展到最大线程数。
  • Tomcat 线程池:更注重快速响应,会在核心线程忙时立即创建新线程,直到达到 maxThreads,只有在所有线程都忙时才使用队列来排队请求。

这种差异使得 Tomcat 在处理高并发 Web 请求时更加高效,因为它能够迅速扩展线程池以应对突然增加的请求负载,同时保持合理的空闲线程数来应对新请求。

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

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

相关文章

【解决方案】Java 互联网项目中消息通知系统的设计与实现

前言 消息通知系统&#xff08;notification-system&#xff09;作为一个独立的微服务&#xff0c;完整地负责了 App 端内所有消息通知相关的后端功能实现。该系统既需要与文章系统、订单系统、会员系统等相关联&#xff0c;也需要和其它业务系统相关联&#xff0c;是一个偏底层…

docker-compose设置永久启动、自动重启

步骤一 找到 docker-compose.yml 文件 步骤二 vim 打开文件 找到 image: PS&#xff1a;就是为了对齐格式 步骤三 在其下方添加&#xff1a; restart: always而后保存即可

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

js算数数据失真

起因 数字的运算失真问题在每个语言中都有体现&#xff0c;在java中使用BigDecimal就可以很好的避免这种情况。前端中没有这样一种类型来处理这种情况 引入别人写好的包 一开始准备自己写&#xff0c;但是觉得太麻烦可以使用 BigNumber.js 这样的库来执行精确的除法运算&#x…

表面声波滤波器——工艺 (5)

制作工艺流程 声表面波器件制作采用半导体集成电路的平面工艺,首先在压电衬底上通过光刻、镀膜、剥离或刻蚀等工艺制备出叉指换能器&#xff0c;然后经过划片、粘片、压丝、封焊等后续封装工艺得到最后的器件。 整个工艺过程中需要操作使用各种机台 清洗机光刻机涂胶显影台全…

京东商品详情API:解锁电商数据的金钥匙

引言 京东开放平台为开发者提供了丰富的API资源&#xff0c;其中商品详情API尤其受到关注。它允许第三方应用和服务直接获取京东商城内商品的详尽信息&#xff0c;这对于电商平台、价格比较网站、数据分析公司以及移动应用开发商来说&#xff0c;都是一个宝贵的工具。本文将深…

Clickhouse副本和分片的概念

副本 https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication 副本是表级别的&#xff0c;不是整个服务器级的。所以&#xff0c;服务器里可以同时有复制表和非复制表。 副本不依赖分片。每个分片有它自己的独立副本。 ClickHouse 使用 Apache Zo…

专业和学校到底怎么选,兴趣和知名度到底哪个重要?

前言 2024高考已经落下帷幕&#xff0c;再过不久就到了激动人心的查分和填报志愿的时刻&#xff0c;在那天到来&#xff0c;小伙伴们就要根据自己的分数选取院校和专业&#xff0c;接下来我就以参加22年(破防年)河南高考的大二生来讲述一下我自己对于如何选取院校和专业的看法以…

香港电讯高可用网络助力企业变革金融计算

客户背景 客户是一家金融行业知名的量化私募对冲基金公司&#xff0c;专注于股票、期权、期货、债券等主要投资市场&#xff0c;在量化私募管理深耕多年&#xff0c;目前资管规模已达数百亿级&#xff0c;在国内多个城市均设有办公地点。 客户需求 由于客户业务倚重量化技术…

从“野人饭”走红,探索品牌户外化营销趋势丨小红书内容分析

wildeat&#xff0c;户外是人的天性的回归 近来&#xff0c;“wildeat&#xff08;户外野吃&#xff09;”的风潮在小红书逐渐兴起。越来越多的人选择到户外吃一顿&#xff0c;做一次“野人”&#xff0c;主打一个只要氛围到了&#xff0c;就地开饭&#xff0c;不愁吃什么&…

Ubuntu中防火墙的使用 和 开放 关闭 端口

目录 1.查看防火墙的状态 2.开启ufw防火墙 3.重启ufw防火墙 4.关闭ufw防火墙 5.设置外来访问默认权限 6.开放普通端口 7.关闭普通端口 8.开放规定协议的端口 9.关闭指定协议端口 10.重启防火墙&#xff0c;是配置生效 1.查看防火墙的状态 sudo ufw status 2.开启uf…

屏蔽房是做什么用的?为什么需要定期检测?

屏蔽房对于不了解的人来说&#xff0c;可能光看名字不知道是做什么的&#xff0c;但是对于一些企业或者机构&#xff0c;却是再熟悉不过的了。和名字一样&#xff0c;屏蔽房是对空间内的信号以及一些外界环境条件进行隔绝&#xff0c;在一些有特殊要求的企业机构中&#xff0c;…

睿治数据治理平台焕新升级,推出全新建模与调度平台

在数据治理的浩瀚征途中&#xff0c;企业常常面临着数据冗余如同连绵山峦&#xff0c;使得关键信息的获取变得困难重重&#xff1b;在数据检索的海洋中&#xff0c;有时迷失方向&#xff0c;消耗大量时间精力&#xff0c;严重影响了运营效率&#xff1b;特别是在处理大规模数据…

assertJ-db 科普

前言 今日我们看看 java 大名鼎鼎的 assertj 是怎么做断言的 数据库断言 在实际的测试中我们总是跟业务打交道的。跟业务打交道一般很难避免验证数据库中的东西。尤其在接口测试中&#xff0c;一个常见的例子是你测试一个下单的接口。 接口返回可能就是成功过或者失败。你无…

AI换脸实践

1.windows版本 解压即用&#xff0c;2024最简单好用AI开源换脸应用&#xff0c;整合包已备好&#xff0c;快试试吧&#xff01;_哔哩哔哩_bilibili 2.linux版本 1&#xff09;克隆roop项目 git clone https://github.com/s0md3v/roop 创建虚拟环境 python -m venv venv 激…

安装 Fedora CoreOS 操作系统

首发日期 2024-06-16, 以下为原文内容: 有一台吃灰几年的 e5-26v3 古老机器, 最近翻出来用一下. 首先从安装操作系统开始. 目录 1 FCOS 简介2 安装过程 2.1 下载 iso 镜像文件并制作安装 U 盘2.2 编写安装配置文件2.3 编译安装配置文件2.4 从 U 盘启动并安装 3 SSH 连接并测试…

直播平台美颜技术分析:视频美颜SDK功能实现原理

本篇文章&#xff0c;笔者将深入分析视频美颜SDK的功能实现原理&#xff0c;探讨其在直播平台中的应用。 一、视频美颜技术概述 通过这些功能&#xff0c;用户可以在直播过程中呈现更加理想的自己&#xff0c;从而提高观众的观看体验和互动积极性。 二、视频美颜SDK的功能 1…

不“卷”低价,品牌如何让客户愿意“留下”?

天猫取消预售制度&#xff0c;满减力度大于往年&#xff0c;京东直接将“又便宜又好”定为大促主题。今年的618&#xff0c;离不开两大关键词&#xff1a;拼低价 和 回归用户。 价格“内卷”&#xff0c;消费者可以花更少的钱买到商品&#xff0c;但对商家来说&#xff0c;意味…

6月19日(周三)A股行情总结:A股震荡收跌,恒生科技指数大涨3%,10年期国债期货转涨续创新高

内容提要 车路云概念延续昨日涨势&#xff0c;华铭智能20CM 3连板。贵金属及PEEK材料概念全日走强&#xff1b;港股有色金属及能源股走强&#xff0c;紫金矿业涨超3%&#xff0c;中石油涨超3%。国债期货午后全线转涨&#xff0c;10年期主力合约涨0.05%报104.925元&#xff0c;…

6.17继承

面向对象的特征&#xff1a;封装&#xff0c;继承&#xff0c;多态 使用背景&#xff1a;比如说在动物类底下可以有带毛的动物&#xff0c;带毛的动物符合所有的动物的特征&#xff0c;只是在这个基础上再继续添加一些特征 命名&#xff1a;原有类型称为“基类”或“父类”&a…