ThreadPoolExecutor详解(上)

news2024/11/15 4:48:07

为什么会有线程池?

如果客户端发一个请求,服务端就创建一个线程接收请求,线程资源是有限的,而且创建一个线程和执行结束之后都要调用操作系统资源销毁线程,这样频繁操作肯定非常占用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() {
			
			@Override
			public Thread newThread(Runnable r) {
				Thread thread = new Thread(r);
				thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
					
					@Override
					public void uncaughtException(Thread t, Throwable e) {
						System.out.println("拦截异常");
					}
				});
				return thread;
			}
		});

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

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

相关文章

性能测试 —— “问题分析”

性能测试大致分以下几个步骤&#xff1a; 需求分析 脚本准备 测试执行 结果整理 问题分析 今天要说的是最后一个步骤——“问题分析”&#xff1b; 需求描述 有一个服务&#xff0c;启动时会加载一个1G的词表文件到内存&#xff0c;请求来了之后&#xff0c;会把请求词去…

构建稳健的PostgreSQL数据库:备份、恢复与灾难恢复策略

在当今数字化时代&#xff0c;数据成为企业最宝贵的资产之一。而数据库是存储、管理和保护这些数据的核心。PostgreSQL&#xff0c;作为一个强大的开源关系型数据库管理系统&#xff0c;被广泛用于各种企业和应用场景。然而&#xff0c;即使使用了最强大的数据库系统&#xff0…

LeetCode 25题:K个一组翻转链表

题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…

嵌入式:C高级 Day2

一、递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 二、递归实现&#xff0c;输入一个数字&#xff0c;输出这个数的二进制 三、写一个脚本&#xff0c;包含以下内容 1.显示/etc/group文件中第五行的内容 2.创建目录/home/ubuntu/copy 3.切换工作路径到此目录…

《命运》阅读笔记

《命运》阅读笔记 2023年5月17号在杭州的小屋读完&#xff0c;我读完后&#xff0c;脑海里经常把余华的《活着》和这本《命运》的故事情节搞混淆&#xff0c;几乎都是讲着生活的苦难。全文以阿太&#xff08;外婆的妈妈&#xff09;的视角&#xff0c;在她九十九岁的人生里&…

在excel中整理sql语句

数据准备 CREATE TABLE t_test (id varchar(32) NOT NULL,title varchar(255) DEFAULT NULL,date datetime DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO t_test VALUES (87896cf20b5a4043b841351c2fd9271f,张三1,2023/6/8 14:06); INSERT INTO t_test …

Electron + Vue3 + Vite + TS 构建桌面应用

之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…

如今音视频开发还有前途吗?

下面我从两个角度来跟大家进行分析&#xff1a; 市场角度薪资角度 这两角度分析下来&#xff0c;估计大家心里就会有答案了&#xff01;&#xff01;&#xff01; 1. 市场角度 目前市场中使用音视频技术的公司太多了&#xff0c;大到全民观看短视频&#xff0c;小到直播带货…

IT 基础架构自动化

什么是 IT 基础架构自动化 IT 基础架构自动化是通过使用技术来控制和管理构成 IT 基础架构的软件、硬件、存储和其他网络组件来减少人为干预的过程&#xff0c;目标是构建高效、可靠的 IT 环境。 为什么要自动化 IT 基础架构 为客户和员工提供无缝的数字体验已成为企业的当务…

【从零开始学习JAVA | 第三十八篇】应用多线程

目录 前言&#xff1a; 多线程的实现方式&#xff1a; Thread常见的成员方法&#xff1a; 总结&#xff1a; 前言&#xff1a; 多线程的引入不仅仅是提高计算机处理能力的技术手段&#xff0c;更是适应当前时代对效率和性能要求的必然选择。在本文中&#xff0c;我们将深入…

百度网盘加速下载

下载网页插件可搜索各种奇葩工具 Tampermonkey 在线解析连接&#xff1a;https://api.94speed.com/web/ 工具下载&#xff1a;https://motrix.app/zh-CN/download 解析完成后发送到&#xff1a;motrix

LeetCode 626. 换座位

题目链接&#xff1a;LeetCode 626. 换座位 题目描述 表名&#xff1a;Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1&#xff1a; 题目分析 如…

Ubuntu20.04安装MySQL8

Ubuntu20.04安装MySQL8 MySQL8下载 点击MySQL download下载官网&#xff0c;按照自己所需要的版本下载对应的MySQL版本&#xff0c;如下图 点击下载后在进行解压&#xff0c;大致文件如下所示 然后需要一次安装对应的.deb文件。普通.deb程序安装命令&#xff1a; dpkg -i …

前端:地图篇(一)

1、前言 在很多的出行程序中&#xff0c;都会使用到地图这一个功能&#xff0c;在实际的开发中我们也不会去开发一个自己的地图模型。如果自己开发一个地图模型&#xff0c;那么需要投入的成本、人力都是非常巨大的。所以我们很多网站和APP中使用的都是第三方的接口和JS&#…

本地部署 audiocraft

本地部署 audiocraft 1. 什么是 audiocraft2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 部署 audiocraft6. 启动 MusicGen7. 访问 MusicGen 1. 什么是 audiocraft Audiocraft 是一个通过深度学习进行音频处理和生成的库。它具有最先进的 EnCodec 音频压缩器/分词器&am…

Java Selenium WebDriver 网页填报

一、windows环境安装配置 1.安装chrome浏览器 在“关于chrome”界面&#xff0c;查看浏览器版本号 2.下载chromeDriver 在https://registry.npmmirror.com/binary.html?pathchromedriver/下载对应版本的驱动&#xff08;如果浏览器版本过新&#xff0c;建议下载最接近的版…

day20-101. 对称二叉树

101. 对称二叉树 力扣题目链接 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 思路 镜像对称必要的条件就是根节点的左右子树互相对称 左子树的左孩子 右子树的右孩子左子树的右孩子 右子树的左孩子 递归 使用递归前要确定递归的顺序&#xff0c;是前序、后序还…

N个实现水平垂直居中的方法

1 行内元素的水平垂直居中 1.1 单行文本 要实现行内元素的水平居中&#xff0c;只需把行内元素包裹在块级父层元素中&#xff0c;并且在父层元素CSS设置如下&#xff1a; <div class"box"><p>center</p> </div>.box{background-color: aq…

Docker Compose编排部署LNMP服务

目录 安装docker-ce 阿里云镜像加速器 文件 启动 安装docker-ce [rootlocalhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo --2023-08-03 18:34:32-- http://mirrors.aliyun.com/repo/Centos-7.repo 正在解析主机 m…

Set-up ESP-AT Environment on Windows using CMD

Before you start, the following environments need to be installed: Git BashPython environment, suggest Python version: 3.8.7. Please ensure the installation of Python v3.8 version environment, and remember to select the option “add to PATH” during the in…