ThreadPoolExecutor详解(上)

为什么会有线程池?

如果客户端发一个请求,服务端就创建一个线程接收请求,线程资源是有限的,而且创建一个线程和执行结束之后都要调用操作系统资源销毁线程,这样频繁操作肯定非常占用cpu和内存资源,线程池的作用就是实现线程的资源复用和控制最大线程数,还有队列异步处理请求,这样就减少线程资源的浪费

一、ThreadPoolExecutor参数如何设置

核心线程数(corePoolSize)、最大线程数(maximumPoolSize)

可以根据三个方面进行分析:

  • CPU密集型任务:要避免线程的上下文切换,所以尽量要少创建线程,把corePoolSize设置成CPU核心数+1(加1是为了避免当中有的线程因为特殊情况被挂起,为了尽可能的利用CPU资源)
  • IO密集型任务:当线程操作IO资源时,CPU资源是闲置的,我们可以尽可能创建合适的线程数来压榨CPU资源,IO时间越长,可以设置更多的线程数,但是不一定越多越好,我们可以通过这个公式来计算:线程数=CPU核心数*(1+线程等待时间/线程运行总时间)
  • 混合型任务

总时间-总时间(CPU)=线程等待时间

理想状态下可这样估算,但是系统可能运行有其它线程,所以要进行压测

jmeter压测:

pom.xml文件配置:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><relativePath/> <!-- lookup parent from repository --></parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

java代码:

@SpringBootApplication
public class Application {public static void main(String[] args){SpringApplication.run(Application.class, args);}
}@RestController
public class TestController {@GetMapping("/test")public String test() throws InterruptedException {Thread.sleep(1000);return "test";}
}

 jmeter压测操作:

 

 添加聚合报告

添加结果树视图

聚合结果报告

默认最大200个连接,总执行时间25s,平均响应时间(Average)4.2s,最小响应时间(Min)1s,最大响应时间(Max)8s,请求错误率(Error)0%,吞吐量(Throughput)每秒钟完成125.5个请求

设置最大800个连接,总执行时间9s,平均响应时间(Average)1.2s,最小响应时间(Min)1s,最大响应时间(Max)2.5s,请求错误率(Error)0%,吞吐量(Throughput)每秒钟完成560.6个请求

 基本上压测最大连接数值如果平均响应时间和执行总时间趋于稳定为准

 总结:

  • CPU密集型任务:CPU核心数+1
  • IO密集型任务:抽样系统高峰期CPU执行时间,再先通过公式算出理论值,然后通过理论值进行压测
  • 压测的业务如果是核心业务,并发量高,比如1s需要处理1000个请求,corePoolSize和maximumPoolSize都可以设置成500,如果是非核心业务,并发量小,核心线程数保留10个就行,最大线程数设置1000
  • 队列大小需要根据线程1s能处理多少请求,比如1s能处理100个请求,队列中有300个任务,也就是说任务可能要等3s才能处理完,如果不能接受这个时间就要限制队列大小

二、ThreadPoolExecutor具体执行过程

1、JUC包下ThreadPoolExecutor执行流程

核心线程来一个任务创建一个线程,提交任务数超过核心线程数会放到队列中,队列中放不下会在小于maximumPoolSize前提又创建新任务,核心线程和非核心线程任务都做完了,都会到队列中去拿任务

2、tomcat的ThreadPoolExecutor执行流程

创建ThreadPoolExecutor对象时就已经初始化好了核心线程

三、ThreadPoolExecutor如何关闭

正常关闭、异常关闭、手动调用shutdown()、shutdownNow()方法

https://www.processon.com/view/link/64cb797372e1a4480965cf86

为什么线程池执行任务时抛出异常会重新创建一个线程?

方便做线程异常处理,如果直接忽略导致无法处理异常,所以让它抛出异常终止,然后重启一个线程

ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 100, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(100), new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println("拦截异常");}});return thread;}});

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

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

相关文章

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…

shiro快速入门

文章目录 权限管理什么是权限管理&#xff1f;什么是身份认证&#xff1f;什么是授权&#xff1f; 什么是shiro&#xff1f;shiro的核心架构shiro中的三个核心组件 shiro中的认证shiro中的授权shiro使用默认Ehcache实现缓存shiro使用redis作为缓存实现 权限管理 什么是权限管理…

truncate和delete的区别

两者都可以删除表中的数据&#xff0c;但是本质上是有区别的&#xff0c;两者使用方法如下&#xff1a; --删除表中所有数据 DELETE FROM table_name; --删除表中部分符合条件的数据 DELETE FROM table_name WHERE 【】;--删除表中所有数据 TRUNACTE TABLE table_name;1、SQL语…

华为OD机考--【磁盘容量排序】

■ 题目描述 【磁盘容量排序】 磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T = 1024G,1G = 1024M,现在给定n块磁盘的容量, 请对它们按从小到大的顺序进行稳定排序,例如给定5块盘的容量,1T,20M,3G,10G6T,3M12G9M排序后的结果为20M,3G,3M12G9…

MySQL 数据库、表的基本操作

目录 数据库 关系数据库SQL 关系数据库常用词汇 常用命令语句 数据库操作 查看数据库 创建数据库 修改数据库编码 删除数据库 数据表操作 查看数据表 创建数据表 表中数据操作 增 删 改 查 数据库 数据库是在数据管理和程序开发过程中&#xff0c;一种非常重要…

Express中间件

1.创建最基本的中间件 const express require(express); const send require(send);const app express()const mw function (req, res, next) {console.log(middleware);// 一定要调用next() 把流转关系交给下一个中间件或路由next() }app.listen(80, () > {console.l…

SpringBoot —程序包org.springframework.boot.test.context不存在

一. 遇到问题 &#xff1a;程序包org.springframework.boot.test.context不存在 发生错误的原因是项目中缺少spring-boot-starter-test依赖导致的&#xff0c;解决方案如下: 在项目根目录的pom.xm文件中的<dependencies>节点下增加以下依赖即可&#xff1a; <depen…

【ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令】

文章目录 LDR 指令LDR伪指令LDR伪指令与MOV区别 上篇文章&#xff1a;ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) 下篇文章&#xff1a;ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 LDR指令 与 LDR伪指令 两者虽然名字相同但是作用却不相同&#x…

uniApp 插件 Fvv-UniSerialPort 使用实例

接上一篇 uniApp 对接安卓平板刷卡器, 读取串口数据 , 本文将详细介绍如何使用插件读取到串口数据 原理 通过uniApp 插件读取设备串口数据, 解析后供业务使用; 步骤 创建uniApp 项目;添加插件 安卓串口通信 Fvv-UniSerialPort 安卓串口通信 Fvv-UniSerialPort - DCloud 插件…

PoseiSwap:通过 RWA 的全新叙事,反哺 Nautilus Chain 生态

PoseiSwap 是 Nautilus Chain 上的首个 DEX&#xff0c;作为目前行业内模块化区块链叙事的早期奉行者&#xff0c;PoseiSwap 也得到了较高的市场关注。基于 Nautilus Chain&#xff0c;PoseiSwap 打造了一个全新的 Rollup 应用层&#xff0c;并通过零知识证明来建立全新的订单簿…

刷完这个笔记,15K真的不能再少了....

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…

SQL-每日一题【1174. 即时食物配送 II】

题目 配送表: Delivery 如果顾客期望的配送日期和下单日期相同&#xff0c;则该订单称为 「即时订单」&#xff0c;否则称为「计划订单」。 「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。 写一条 SQL 查询语句获取即时订单在所有用户的首次订…

解决Vue3 使用Element-Plus导航刷新active高亮消失

解决Vue3 使用Element-Plus导航刷新后active高亮消失的问题 启用路由模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 接下来打印一下选中项index和index路径&#xff0c; 刷新也是没有任何问题的&#xff0c;active不会消失…

资产盘点流程及注意事项

公司在引进固定资产管理的同时&#xff0c;也广泛加快了信息化工作的进程。现代计算机技术、条码技术、条码技术等都不能满足传统的固资管理机制&#xff0c;RFID技术、硬件扫描技术、提高固定资产管理流程、固定资产管理和统计等方面的特殊要求。科学规范地管控企业有形资产的…

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…

机器学习的关键词和算法总结

随着全球各行业的数据治理、数字化转型智能化辅助的引入发展&#xff0c;机器学习&#xff08;包括深度学习&#xff09;在逐步深入到各行各业&#xff0c;所以&#xff0c;有必要对机器学习的常见术语&#xff0c;经典算法及应用场景进行一次总结&#xff0c;其实机器学习兴起…

深度学习各层负责什么内容?

1、深度学习——神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【Deep Machine Learning】)是一类算法集合&#xff0c;是机器学习的一个分支。 深度学习方法近年来&#xff0c…

8.3day04git+数据结构

文章目录 git版本控制学习高性能的单机管理主机的心跳服务算法题 git版本控制学习 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 安装g…

【多模态】23、RO-ViT | 基于 Transformer 的开发词汇目标检测(CVPR2023)

文章目录 一、背景二、方法2.1 基础内容2.2 Region-aware Image-text Pretraining2.3 Open-vocabulary Detector Finetuning 三、效果3.1 细节3.2 开放词汇目标检测效果3.3 Image-text retrieval3.4 Transfer object detection3.5 消融实验 论文&#xff1a;Region-Aware Pretr…

【数据结构与算法】TypeScript 实现图结构

class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…