线程池理解及7个参数

定义理解

线程池其实是一种池化的技术实现,池化技术的核心思想就是实现资源的复用,避免资源的重复创建和销毁带来的性能开销。线程池可以管理一堆线程,让线程执行完任务之后不进行销毁,而是继续去处理其它线程已经提交的任务。

使用线程池的好处

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

构造参数

在这里插入图片描述

  • corePoolSize:线程池中用来工作的核心线程数量
  • maximumPoolSize:最大线程数,线程池允许创建的最大线程数。当线程池中的线程数达到corePoolSize后,如果任务队列已满,且需要继续处理新任务,线程池会创建新线程(但总数不超过maximumPoolSize)来处理这些任务。(相当于排队区满了后,后来的线程可以直接插队)如果任务数超过了maximumPoolSize,且任务队列已满,则线程池会根据拒绝策略来处理这些无法执行的任务。
  • keepAliveTime:超出 corePoolSize 后创建的线程存活时间或者是所有线程最大存活时间,取决于配置。
  • unit:keepAliveTime 的时间单位
  • workQueue:任务队列,是一个阻塞队列,当线程数达到核心线程数后,会将任务存储在阻塞队列中。常见实现:BlockingQueue接口的实现类,如ArrayBlockingQueue、LinkedBlockingQueue等。
  • threadFactory :线程池内部创建线程所用的工厂
  • handler:拒绝策略;当队列已满并且线程数量达到最大线程数量时,会调用该方法处理任务。

如何设置参数

1. 确定核心线程数(corePoolSize)

  • CPU密集型任务:对于CPU密集型任务,通常将核心线程数设置为CPU核心数的1到2倍之间。这可以确保充分利用CPU资源,同时避免过多的上下文切换。
  • IO密集型任务:对于IO密集型任务,由于线程在等待IO操作时不会占用CPU,因此可以设置更多的核心线程数。一般来说,可以将核心线程数设置为CPU核心数的2倍以上,以便在等待IO时能够处理更多的任务。
  • 混合型任务:如果应用程序同时包含CPU密集型和IO密集型任务,则需要根据具体情况来平衡核心线程数的设置。

2. 确定最大线程数(maximumPoolSize)

  • 资源受限的环境:在资源受限的环境中(如嵌入式系统或云服务器),需要限制最大线程数以防止过多线程占用资源。
  • 高并发系统:对于需要处理大量并发请求的系统,可以适当增加最大线程数以提高系统的并发处理能力。但是,最大线程数的设置应该基于系统的负载能力和资源状况进行综合考虑。

3. 设置线程空闲时间(keepAliveTime)

  • CPU密集型应用:对于CPU密集型应用,通常可以将线程空闲时间设置为较短的值,因为CPU资源非常宝贵,不希望有过多的空闲线程占用资源。在某些情况下,甚至可以将其设置为0,表示不保留非核心线程。
  • IO密集型应用:对于IO密集型应用,由于线程在等待IO操作时不会占用CPU资源,因此可以将线程空闲时间设置为较长的值(如1分钟以上),以避免线程频繁启动和销毁造成的性能开销。

4. 选择任务队列(workQueue)

  • 有界队列:使用有界队列可以限制任务在队列中的等待时间,避免因为任务过多而导致内存溢出。但是,如果队列长度设置过小,可能会导致任务被拒绝。(一般选择有界队列
  • 无界队列:使用无界队列可以尽可能地缓存所有任务,但是需要注意内存消耗问题。如果使用了无界队列,线程池的最大线程数参数可能会变得无效,因为线程池不会尝试创建新线程来处理队列中的任务。

5. 配置线程工厂(threadFactory)

线程工厂用于创建新线程。通过自定义线程工厂,可以设定线程的优先级、守护线程状态等属性,也可以为线程设置有意义的名字,便于在JVM中进行问题诊断。

6. 配置拒绝策略(handler)

当线程池无法处理新任务时(即线程数已达到maximumPoolSize,且任务队列已满),需要配置拒绝策略来处理这些无法执行的任务。常见的拒绝策略包括直接抛出异常用调用者所在的线程来执行任务忽略新任务以及抛弃队列中最老的任务等。也可以根据需要自定义拒绝策略。

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

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

相关文章

20、matlab信号波形生成:狄利克雷函数、高斯脉冲和高斯脉冲序列

1、名词说明 狄利克雷函数(Dirac Delta Function) 狄利克雷函数,也称为单位冲激函数或δ函数,是一个在数学和信号处理中常用的特殊函数。狄利克雷函数通常用符号δ(t)表示,其定义为: δ(t) { ∞, t 0{…

RabbitMq - Java客户端基础【简单案例 +Work模型】

目录 1、前置知识 1.1、AMQP怎么理解 1.2、Spring AMQP是什么 1.3、为什么要了解Spring-AMQP? 2、使用Spring-AMQP实现一个发消息案例 3、Work模型 问题: 优化: 小结:Work模型的使用: 1、前置知识 1.1、AMQP怎…

简介空间复杂度

我们承接上一篇博客。我们写了时间复杂度之后,我们就要来介绍一下另一个相关复杂度了。空间复杂度。我觉得大家应该对空间复杂度认识可能比较少一些。我就是这样,我很少看见题目中有明确要求过空间复杂度的。但确实有这个是我们不可忽视的,所…

ID3算法决策树

步骤: 先计算出信息量;信息熵;信息增量; 再比较信息增量的大小,确定分类依据。 信息量: 信息熵: 信息增益:

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

Nginx:location配置模块的用法

运维系列 Nginx:location配置模块的用法 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.c…

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息,这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势,还反映了各国和地区自动化水平及产业升级的步伐。例如,数据显示中国在…

550kg级大载重长航时无人机直升机技术详解

550kg级大载重长航时无人机直升机,作为一种高性能的无人机系统,具备了多项先进的技术特点,以满足高海拔、高寒等复杂环境下的应用需求。这些无人机直升机通常具备高载重、长航时、强适应性、高可靠性和良好的任务拓展性。 设备由无人直升机平…

Android sdk 安装已经环境配置

🍎个人博客:个人主页 🏆个人专栏:Android ⛳️ 功不唐捐,玉汝于成 目录 正文 一、下载 二、安装 三、环境配置 我的其他博客 正文 一、下载 1、大家可去官网下载 因为需要魔法 所以就不展示了 2、去下面这…

stm32精密控制步进电机(基础篇)

众所周知,步进电机由于使用脉冲控制,会比直流电机的控制稍难一些,但开环控制时也更加稳定。 落到做项目的时候,目前来说我都会先考虑步进电机,再去考虑直流,无刷这样的电机。包括毕设时所用的机械臂也是用…

整洁架构SOLID-单一职责原则(SRP)

文章目录 定义案例分析重复的假象代码合并解决方案 小结 定义 SRP是SOLID五大设计原则中最容易被误解的一个。也许是名字的原因,很多程序员根据SRP这个名字想当然地认为这个原则就是指:每个模块都应该只做一件事。 在历史上,我们曾经这样描…

四大常见的排序算法JAVA

1. 冒泡排序 相邻的元素两两比较,大的放右边,小的放左边 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以 package Bu…

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录: mkdi…

Ubuntu + SSH密钥连接服务器

1. 下载VS code cd到下载文件夹后,使用命令安装,把xxx复制为文件名 sudo dpkg -i xxx.deb2. 为VSCode换皮肤 3. 下载SSH插件和Docker插件 4. 配置SSH 把密钥key文件放在/home/your_user_name/.ssh/里面,然后在/home/your_user_name/.ssh/c…

昇思25天学习打卡营第7天|深度学习流程全解析:从模型训练到评估

目录 构建数据集 定义神经网络模型 定义超参、损失函数和优化器 超参 损失函数 优化器 训练与评估 构建数据集 首先从数据集 Dataset加载代码,构建数据集。 代码如下: #引入了必要的库和模块,像 mindspore 以及相关的数据处理模块等等。…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机,虚拟机装有Ubuntu系统; 2.在你的windows电脑安装了WinSCP工具; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP,点击新标签页,进入到如下图的…

【持续集成_03课_Jenkins生成Allure报告及Sonar静态扫描】

1、 一、构建之后的配置 1、安装allure插件 安装好之后,可以在这里搜到已经安装的 2、配置allure的allure-commandline 正常配置,是要么在工具里配置,要么在系统里配置 allure-commandline是在工具里进行配置 两种方式进行配置 1&#xff…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

STM32-ADC+DMA

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. ADC模拟-数字转换器1.1 ADC模拟-数字转换器1.2 逐次逼近型ADC1.3 ADC框图1.4 ADC基本结构1.5 输入通道1.6 规则组的转换模式1.6.1 单次转换,非扫描模式1.6.2 连续转换,非扫描模式1.6.3 单次…

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析(Independent Component Analysis,ICA)是一种统计与计算技术,主要用于信号分离,即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离(Blind Source Separation,BSS&#xff0…