线程池理解及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.mzph.cn/diannao/42416.shtml

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

相关文章

GStreamer学习5----probe数据探测

参考资料: gstreamer中如何使用probe(探针)获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客 Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据,还可以使用probe去处理。 在GStreamer中,probe…

LayerNorm Plugin的使用与说明

目录 前言0. 简述1. Layernorm Plugin的使用1.1 源码下载1.2 模型下载和修改1.3 环境配置1.4 编译1.4 engine生成和执行(trtexec)1.5 enging生成和执行(C API) 2. 补充说明2.1 RTMO显存占用问题2.2 插件找不到的说明2.3 LayerNorm plugin封装的尝试2.4 layerNorm plugin核函数实…

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率(p)是一个衡量拉曼散射光偏振状态的参数,它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率(p&…

禁用windows的语音识别快捷键win+ctrl+s

win11组合键winctrls会弹出语音识别提示,即使到设置里禁用了语音识别也没用 解决办法:安装PowerToys,通过“键盘管理器”-“重新映射快捷键”禁用 PowerToys是微软自己的工具,不用担心安全问题,下载地址:h…

第10章:网络与信息安全

目录 第10章:网络与信息安全 网络概述 计算机网络概念 计算机网络的分类 网络的拓扑结构 ISO/OSI网络体系结构 网络互联硬件 物理层互联设备 数据链路层互联设备 网络层互联设备 应用层互联设备 网络的协议与标准 网络标准 TCP/IP协议族 网络接口层协…

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心: 线程池的实现原理是个标准的生产消费者模型,调用方不停向线程池中写数据,线程池中的线程组不停从队列中取任务。 实现…

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网: https:/www.oython.orgl 点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…

python网络编程-TCP/IP

链路层 帧组成(按顺序): 目标MAC:6B 源MAC:6B 类型:2B 数据:46B-1500B CRC:4B 其中,源MAC为主机网卡地址,类型为来源网络层的数据类型,ipv…

如何有效管理你的Facebook时间线?

Facebook作为全球最大的社交平台之一,每天都有大量的信息和内容在用户的时间线上展示。有效管理你的Facebook时间线,不仅可以提升用户体验,还能够帮助你更好地控制信息流和社交互动。本文将探讨多种方法和技巧,帮助你有效管理个人…

分班结果老师怎么发给家长?

分班结果老师怎么发给家长? 随着新学期的脚步渐近,老师们的工作也变得愈发繁忙。从准备教学计划到整理课程材料,每一项任务都不容小觑。而其中,分班结果的告知工作,更是让不少老师头疼不已。传统的分班通知方式&#…

Python爬虫与数据可视化:构建完整的数据采集与分析流程

Python爬虫技术概述 Python爬虫是一种自动化的数据采集工具,它可以模拟浏览器行为,访问网页并提取所需信息。Python爬虫的实现通常涉及以下几个步骤: 发送网页请求:使用requests库向目标网站发送HTTP请求。获取网页内容&#xf…

15集终于编译成功了-了个球!编译TFLite Micro语音识别工程-《MCU嵌入式AI开发笔记》

15集终于编译成功了-个球!编译TFLite Micro语音识别工程-《MCU嵌入式AI开发笔记》 还是参考这个官方文档: https://codelabs.developers.google.cn/codelabs/sparkfun-tensorflow#2 全是干货! 这里面提到的这个Micro工程已经移开了&#xff1…

【微服务】springboot对接Prometheus指标监控使用详解

目录 一、前言 二、微服务监控概述 2.1 微服务常用监控指标 2.2 微服务常用指标监控工具 2.3 微服务使用Prometheus监控优势 三、环境准备 3.1 部署Prometheus服务 3.2 部署Grafana 服务 3.3 提前搭建springboot工程 3.3.1 引入基础依赖 3.3.2 配置Actuator 端点 3.…

【Linux】信号的处理

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 信号的处理 1 信号的处理2 内核态 VS 用户态3 键盘输入数据的过程4 如何理解OS如何正常的运行5 如何进行信号捕捉信号处理的总结6 可重入函数volatile关…

C# 如何获取属性的displayName的3种方式

文章目录 1. 使用特性直接访问2. 使用GetCustomAttribute()方法通过反射获取3. 使用LINQ查询总结和比较 在C#中,获取属性的displayName可以通过多种方式实现,包括使用特性、反射和LINQ。下面我将分别展示每种方法,并提供具体的示例代码。 1.…

数据库逆向工程工具reverse_sql

reverse_sql 是一个用于解析和转换 MySQL 二进制日志(binlog)的工具。它可以将二进制日志文件中记录的数据库更改操作(如插入、更新、删除)转换为反向的 SQL 语句,以便对系统或人为产生的误操作进行数据回滚和恢复。 *…

JVM专题之垃圾收集器

JVM参数 3.1.1 标准参数 -version -help -server -cp 3.1.2 -X参数 非标准参数,也就是在JDK各个版本中可能会变动 ``` -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM自己来决定 3.1.3 -XX参数 > 使用得最多的参数类型 > > 非…

【Python】已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:(paddleocr导包报错)ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 近日,一些使用PaddleOCR库进行文字…

Python数据分析案例49——基于机器学习的垃圾邮件分类系统构建(朴素贝叶斯,支持向量机)

案例背景 trec06c是非常经典的邮件分类的数据,还是难能可贵的中文数据集。 这个数据集从一堆txt压缩包里面提取出来整理为excel文件还真不容不易,肯定要做一下文本分类。 虽然现在文本分类基本都是深度学习了,但是传统的机器学习也能做。本案…

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容 用一个真双端RAM,端口A和端口B同时向RAM里写入数据0-99,A端口读出单数并存入单端口RAM1中,B端口读出双数并存入但端口RAM2中,当检测到按键1到来时将RAM1中的单数读出显示到PC端,当检测到按键2到来时&…