关于如何合理设置线程池参数解决方案

news2024/11/15 14:06:57

关于如何合理设置线程池参数解决方案(ThreadPoolExecutor)

线程池参数有哪些

我们直接来看构造方法

...
public ThreadPoolExecutor(int var1, int var2, long var3, TimeUnit var5, BlockingQueue<Runnable> var6,
			ThreadFactory var7, RejectedExecutionHandler var8) {
		this.ctl = new AtomicInteger(ctlOf(-536870912, 0));
		this.mainLock = new ReentrantLock();
		this.workers = new HashSet();
		this.termination = this.mainLock.newCondition();
		if (var1 >= 0 && var2 > 0 && var2 >= var1 && var3 >= 0L) {
			if (var6 != null && var7 != null && var8 != null) {
				this.acc = System.getSecurityManager() == null ? null : AccessController.getContext();
				//核心线程数
				this.corePoolSize = var1;
				//最大线程数
				this.maximumPoolSize = var2;
				//工作队列
				this.workQueue = var6;
				//线程存活时间
				this.keepAliveTime = var5.toNanos(var3);
				//线程工厂
				this.threadFactory = var7;
				//拒绝策略
				this.handler = var8;
			} else {
				throw new NullPointerException();
			}
		} else {
			throw new IllegalArgumentException();
		}
	}
	...

根据构造方法我们可以观察有7个参数
最最重要的三个参数,该解决方案也是围绕着这三个参数进行展开。
corePoolSize
maximumPoolSize
workQueue

美团是这么做的

大家想一想,美团饭点时的业务峰值和凌晨的业务峰值一样吗?这就要求在高峰期的时候,处理业务的线程能覆盖住业务量(当然nginx负载均衡、或其它限流框架也能做到这点,这里仅讨论在一个服务内如何做到伸缩自如),所以根据业务峰去做出调整即为合理的解决方案。

线程池处理任务流程

在这里插入图片描述
根据上面的流程图,我们只需要在三个关键点去做到动态配置即可,下面一一列举

动态设置corePoolSize

ThreadPoolExecutor里面给我们提供了setCorePoolSize(int var1)方法,能让我们在线程池运行的过程中去动态设置核心线程数。

源码解析

public void setCorePoolSize(int var1) {
		if (var1 < 0) {
			throw new IllegalArgumentException();
		} else {
			int var2 = var1 - this.corePoolSize;
			this.corePoolSize = var1;
			if (workerCountOf(this.ctl.get()) > var1) {
				this.interruptIdleWorkers();
			} else if (var2 > 0) {
				int var3 = Math.min(var2, this.workQueue.size());

				while (var3-- > 0 && this.addWorker((Runnable) null, true) && !this.workQueue.isEmpty()) {
					;
				}
			}

		}
	}

步骤:
1.首先判断传进来的var1是否符合要求、不符合直接抛出异常。

2.将corePoolSize 设置为var1。

3.workerCountOf(this.ctl.get())这个方法就是判断当前线程池正在工作的线程数,判断是否大于var1(ctl这个属性通过高位、低位来维护了线程数量,还维护了线程池的运行状态,为什么这么使用,因为在线程池的大多数方法中都需要去获取线程池工作线程的数量以及状态,AtomicInteger ctl本身是一个线程安全的对象),如果大于var1,则像正在工作的线程发出中断请求,以回收线程。

4.如果小于var1,会将var2(var1与旧corePoolSize 的差值)会跟现在阻塞队列的长度进行比较,获取比较小的那个值var3,取出阻塞队列var3个任务执行。

5.这样就完成了对一个正在运行的线程池动态改变corePoolSize 的操作。

动态设置maximumPoolSize

ThreadPoolExecutor里面给我们提供了setMaximumPoolSize(int var1)方法,能让我们在线程池运行的过程中去动态设置最大线程数。

源码解析

public void setMaximumPoolSize(int var1) {
		if (var1 > 0 && var1 >= this.corePoolSize) {
			this.maximumPoolSize = var1;
			if (workerCountOf(this.ctl.get()) > var1) {
				this.interruptIdleWorkers();
			}

		} else {
			throw new IllegalArgumentException();
		}
	}

这个相对操作核心线程来说就比较简单了

步骤:
1.当然还是先判断传入的参数符不符合规范,不符合直接抛出异常

2.将maximumPoolSize 设置为var1

3.判断当前工作线程数是否大于var1,大于则向当前工作线程发出中断请求,回收线程

重写workQueue

因为阻塞队列中的capacity也就是初始化队列的长度使用final字符来进行修饰,所以当队列长度一旦确定就不可更改
美团技术团队的解决方法是将LinkedBlockingQueue重写了,也就是把capacityfinal去掉,达到了通过改变capacity的值来达到控制阻塞队列长度的目的

创作不易,转载请标注!!!

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

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

相关文章

W25Q256被写保护如何修改

W25Q256被写保护如何修改1、 W25Q256数据读不到1.1 打印的寄存器的值1.2 可能原因1.3 解决办法1.4 用到的函数1、 W25Q256数据读不到 能够正确的读到ID&#xff0c;但是读到的数据不正确 1.1 打印的寄存器的值 0x2 BUSY &#xff1a;只读&#xff0c; 指令正在执行 WEL (1) &…

物盾安全汤晓冬:工业互联网企业如何应对高发的供应链安全风险?

编者按&#xff1a;物盾安全是一家专注于物联网安全的产品厂商&#xff0c;其核心产品“物安盾”在能源、制造、交通等多个领域落地&#xff0c;为这些行业企业提供覆盖物联网云、管、边、端的安全整体解决方案。“物安盾”集成了腾讯安全制品扫描&#xff08;BSCA&#xff09;…

【二】kubernetes操作

k8s卸载重置 名词解释 1、Namespace&#xff1a;名称用来隔离资源&#xff0c;不隔离网络 创建名称空间 一、命名空间namesapce 方式一&#xff1a;命令行创建 kubectl create ns hello删除名称空间 kubectl delete ns hello查询指定的名称空间 kubectl get pod -n kube-s…

【Adobe国际认证中文官网】Adobe中国摄影计划,免费安装 正版激活

一直以来国内有非常多的 Adobe 用户&#xff0c;但苦于正版的购买渠道较少、价格较为高昂&#xff0c;转而选择其他国家或地区的 Adobe 计划&#xff0c;亦或者是其他软件。这次Adobe在杭州宣布在中国大陆地区推出面向专业摄影师及摄影爱好者的Adobe Creative Cloud 中国摄影计…

大话数据结构-普里姆算法(Prim)和克鲁斯卡尔算法(Kruskal)

5 最小生成树 构造连通网的最小代价生成树称为最小生成树&#xff0c;即Minimum Cost Spanning Tree&#xff0c;最小生成树通常是基于无向网/有向网构造的。 找连通网的最小生成树&#xff0c;经典的有两种算法&#xff0c;普里姆算法和克鲁斯卡尔算法。 5.1 普里姆&#xff…

技术分享| 如何使用Prometheus实现系统监控报警邮件通知

上一篇关于Prometheus的文章中说到了Prometheus是如何实现进程监控。在实际的线上环境中&#xff0c;当系统进程出现异常后需要实时通知到值班运维人员&#xff0c;去检查系统是否还正常运转。下面我们就介绍下基于Prometheus如何实现监控报警通知。 Prometheus的报警通知&…

【蓝桥杯每日一题】递归算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…

【项目】Vue3+TS 动态路由 面包屑 查询重置 列表

&#x1f4ad;&#x1f4ad; ✨&#xff1a;【项目】Vue3TS 动态路由 面包屑 查询重置 列表   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 热烈的不是青春&#xff0c;而是我们&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0…

jsoncpp+cmake使用

目录写在前面准备clone源码编译使用编译运行参考写在前面 1、本文内容 jsoncpp编译及其使用 2、平台 windows10, linux 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/129300456 准备 clone源码 mkdir json cd json git clone https:…

【软件测试】老鸟告诉我内-幕,jmeter性能测试压力测试有多香?薪资真翻2倍......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 压力测试&#xff0…

Composer安装与配置教程

一、windows系统下安装安装Composer教程下载安装php 方法一、下载Composer安装包安装完成后CMD运行 composer --version 命令查看版本号&#xff0c;正常显示版本号则表示安装成功3、方法二、CMD命令安装composer安装前请务必确保已经正确安装了 PHP。打开命令行窗口并执行 php…

计算机网络安全基础知识1:渗透测试,网络连接的核心TCP/IP体系结构,公网,内网,ip地址和端口

计算机网络安全基础知识1&#xff1a;渗透测试&#xff0c;网络连接的核心TCP/IP体系结构&#xff0c;公网&#xff0c;内网&#xff0c;ip地址和端口 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去…

frp内网穿透实验

Frp (Fast Reverse Proxy) 是比较流行的一款。FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。你可以粗略理解它是一个中转站&#xff0c; 帮你实现 公网 ←→ FRP(服务器) ←→ 内网…

数字化创新应用发布加速,JFrog DevOps 正当时

出品 | CSDN 云计算 数字化进程&#xff0c;每天都在发生。 对于技术开发来说&#xff0c;从业务和场景探索和快速开发创新应用&#xff0c;将带来整个开发流程的全新挑战。根据 IDC 分析&#xff0c;到 2024 年时&#xff0c;全球将会有 5.2 亿个软件应用。而超过 60%的企业每…

【教学类-07-06】20230302《破译电话号码-图形篇(图形固定列不重复)》(三款输入版)

效果展示1、适合中班默写学号——有姓名 有班级&#xff0c;无学号&#xff0c;适合中班幼儿2、适合大班幼儿默写名字——有学号&#xff0c;有班级&#xff0c;无姓名&#xff0c;适合初学者描字&#xff08;小班、中班、大班&#xff09;——名字、学号、班级都有&#xff08…

软件测试需要学习什么?好就业么

软件测试需要学习测试环境、网络环境、windows环境、数据库管理、编程技巧&#xff08;java编程设计&#xff0c;脚本语言&#xff0c;设计工具&#xff0c;XML编程、软件测试技术&#xff0c;测试理论&#xff0c;方法&#xff0c;流程&#xff0c;文档写作&#xff0c;测试工…

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。 一、小程序1. 创建小程序2. 首页3. 房源列表页4. 房源详情页5. 个人中心页</

mysql双机互为主从配置记录

1.准备2台机器 server1 192.168.0.37 server2 192.168.0.119 2.安装mysql&#xff0c;我这里用的docker-compose server1的docker-compose version: 3 services:db:build: ./buildcontainer_name: dbimage: mysql:5.6restart: alwayscommand:--character-set-serverutf8mb4…

python使用openpyxl处理excel表格数据

python使用openpyxl处理excel表格数据前言一、安装openpyxl包二、读取excel数据1. 获取excel表格的页码2. 获取excel表格某一行的数据3. 获取excel表格某一列的数据4. 获取excel表格n行n列的数据5. 获取excel表格某一格的数据三、把数据写入excel数据中前言 对于excel表格&…

探讨==和equals的区别和联系,为什么equals()和hashcode()要一起重写?

(一) 探讨和equals的区别和联系&#xff1f; 面试考题&#xff1a;《关于和equals的区别》&#xff0c;该怎么回答完美呢&#xff1f; 可以这样回答&#xff1a; &#xff08;1&#xff09;对于 简单来说比较的是指相等 ①&#xff1a;对于基本数据类型,则直接比较的是对应…