JUC线程池的实战问题 - 线程池参数应该如何配置?

news2025/2/27 21:15:45

Oracle 官方并没有给出线程池 corePoolSize 的具体参考值,因为这个值的大小应该根据实际业务场景和系统资源情况来进行优化调整。不同的业务场景和系统资源状况可能需要不同的 corePoolSize 设置。

在《Java并发编程实战》一书中,作者 Brian Goetz 等人指出,线程池的规模应该根据任务类型和计算密集度来确定,对于 CPU 密集型任务,应该将核心线程数设置为处理器核心数加 1 或者 2;对于 I/O 密集型任务,可以适当增加核心线程数以利用空闲的 CPU 时间。

这个建议是基于以下考虑:对于 CPU 密集型任务,线程需要大量计算,因此需要足够多的 CPU 资源,而处理器核心数加 1 或者 2 的数量可以充分利用 CPU 资源,避免线程之间的竞争和阻塞;而对于 I/O 密集型任务,由于线程大部分时间都处于等待 I/O 操作的状态,因此可以适当增加核心线程数以利用空闲的 CPU 时间,从而提高系统效率。虽然这个建议并非官方标准,但在实际应用中已经得到广泛的认可和应用,并取得了不错的效果。

线程池的参数配置需要根据实际场景和需求进行选择,以下详细的说明:

1、corePoolSize:线程池的 corePoolSize 表示核心线程数,即在不发生任务队列满或者其他拒绝策略下,线程池保持的最小线程数。

corePoolSize 的配置需要根据具体情况进行调整,以满足业务需求和系统性能要求。在进行 corePoolSize 配置时,需要考虑以下因素:

1)任务类型和数量:不同类型的任务对线程池的需求不同。比如 I/O 密集型任务可以使用更多的线程以提高并行性,而计算密集型任务则需要更少的线程以避免 CPU 过载。任务数量多时,线程池的 corePoolSize 需要相应增加。

2)系统资源限制:线程池的 corePoolSize 需要根据系统的硬件资源进行配置,如 CPU 核心数、内存大小等。过大的 corePoolSize 可能会导致系统过度消耗资源,从而影响系统的稳定性和可靠性。

3)线程池负载:如果线程池的任务队列已经满了,但是还有大量的任务等待执行,此时如果 corePoolSize 设置的过小,就可能导致任务不能及时得到处理。此时需要调整 corePoolSize 的值,以确保足够的线程可用。

4)响应时间要求:如果业务需求对任务的响应速度要求较高,那么需要考虑增加 corePoolSize 的配置,以提高任务的并发处理能力。

Oracle 官方并没有给出线程池 corePoolSize 的具体参考值,因为这个值的大小应该根据实际业务场景和系统资源情况来进行优化调整。不同的业务场景和系统资源状况可能需要不同的 corePoolSize 设置。不过,在《Java并发编程实战》一书中给出了建议。在这本书中,作者 Brian Goetz 等人指出,线程池的规模应该根据任务类型和计算密集度来确定。

在这里插入图片描述
对于 CPU 密集型任务,应该将核心线程数设置为处理器核心数加 1 或者 2;
对于 I/O 密集型任务,可以适当增加核心线程数以利用空闲的 CPU 时间。具体大小可以根据实际情况进行调整,建议设置在 2 x N 左右,其中 N 是可用 CPU 核心数。

这个建议是基于以下考虑:对于 CPU 密集型任务,线程需要大量计算,因此需要足够多的 CPU 资源,而处理器核心数加 1 或者 2 的数量可以充分利用 CPU 资源,避免线程之间的竞争和阻塞;而对于 I/O 密集型任务,由于线程大部分时间都处于等待 I/O 操作的状态,因此可以适当增加核心线程数以利用空闲的 CPU 时间,从而提高系统效率。虽然这个建议并非官方标准,但在实际应用中已经得到广泛的认可和应用,并取得了不错的效果。

2、maximumPoolSize: 最大线程数,表示线程池中最多能够容纳的线程数量。

根据实际业务情况、系统资源和性能考虑来选择,一般建议不要过大,避免因过度创建线程而影响系统性能和稳定性。最大线程数应该合理设置,避免过度创建线程造成资源浪费,但又要保证能够满足高并发情况下的需求。

在《Java并发编程实战》一书中,关于线程池的 maximumPoolSize 参数,建议设置为可用 CPU 核心数的两倍加一。这个建议是基于以下考虑:对于 CPU 密集型任务,因为线程需要大量计算,所以应该将线程池规模设置得稍微小一些,以避免过多的线程竞争和阻塞。对于 I/O 密集型任务,线程大部分时间都处于等待 I/O 操作的状态,因此可以适当增大线程池规模,以利用空闲的 CPU 时间,提高系统效率。据此,如果可用 CPU 核心数为 N,则建议将 maximumPoolSize 设置为 2N+1。

当然,这只是一个参考值,真正的线程池参数设置需要根据实际业务场景和系统资源情况进行优化。例如,如果任务类型比较多样化或者任务运行时间比较长,可以适当调整线程池规模,以保证系统稳定性和高效性的前提下,尽可能地充分利用系统资源,提高任务处理能力和效率。

**3、keepAliveTime:**一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁;如果allowCoreThreadTimeOut被设置为true时,无论线程数多少,线程处于空闲状态超过一定时间就会被销毁掉。

在《Java并发编程实战》一书中,关于线程池的 keepAliveTime 参数,建议设置为数十秒或者数分钟。这个建议是基于以下考虑:

对于 CPU 密集型任务,因为线程需要大量计算,所以不宜让空闲线程持续存在,以避免浪费系统资源。因此,建议将 keepAliveTime 设置得较短(例如 10 秒),以便及时回收空闲线程。

对于 I/O 密集型任务,由于线程大部分时间都处于等待 I/O 操作的状态,因此可以适当增加 keepAliveTime,以利用空闲的 CPU 时间,提高系统效率。建议 keepAliveTime 的值在数十秒或者数分钟之间。需要注意的是,这些参考值只是一个起点,真正的线程池参数设置应该根据实际业务场景和系统资源情况来进行优化调整。

例如,如果任务类型比较多样化,可以将 keepAliveTime 设置得稍微长一些;如果任务运行时间比较长,也可以将 keepAliveTime 调整得更长一些,以减少不必要的线程创建和销毁操作。最终的目标是在保证系统稳定性和高效性的前提下,尽可能地充分利用系统资源,提高任务处理能力和效率。

4、workQueue: workQueue是线程池的任务队列,它用来缓存等待执行的任务。workQueue的值应该根据具体的业务场景和需求来设置,不同的队列类型有不同的特点和适用场合。

一般来说,workQueue的值可以分为有界队列和无界队列两种。有界队列可以限制任务队列的长度,避免内存溢出,但是也可能导致任务被拒绝或者阻塞。无界队列可以接受任意数量的任务,但是也可能导致内存占用过大或者性能下降。

如果任务是CPU密集型的,那么可以选择一个较小的队列,以避免CPU空闲或者上下文切换过多。

如果任务是IO密集型的,那么可以选择一个较大的队列,以提高线程利用率和吞吐量。

如果任务是有优先级或者依赖关系的,那么可以选择一个支持排序或者延迟执行的队列。

如果任务是异步的,那么可以选择一个支持回调或者通知的队列。

5、RejectedExecutionHandler 在《Java并发编程实战》一书中,关于线程池的 RejectedExecutionHandler 参数,建议根据业务需求和系统情况选择合适的策略。以下是一些常用的策略及其特点:

CallerRunsPolicy:将任务回退到调用者线程执行。这种策略可以避免任务丢失,并且不会导致队列溢出,但可能会影响调用线程的性能。

AbortPolicy:直接抛出 RejectedExecutionException 异常,以拒绝新的任务提交。这种策略可以保证系统稳定性,但会导致部分任务无法完成,因此需要根据实际情况做好异常处理和日志记录。

DiscardPolicy:直接丢弃新的任务,不予处理。这种策略适用于那些对任务结果要求不高的场景,但也可能会导致任务丢失,因此需要慎重使用。

DiscardOldestPolicy:丢弃队列中等待时间最长的任务,并尝试重新提交新的任务。这种策略可以保证队列不会溢出,但可能会导致一些任务被丢失或延迟执行。

需要注意的是,以上策略都是针对有界队列的情况下,如果使用无界队列,则只有 CallerRunsPolicy 策略和 AbortPolicy 策略是有效的,而 DiscardPolicy 和 DiscardOldestPolicy 策略则没有意义。

最终的选择应该根据实际需求和系统情况进行评估和测试,以确保选择的策略符合业务需求,并且能够保证系统稳定性和高效性。

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

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

相关文章

试卷擦除答案的工具,几个步骤轻松搞定

在学生的学习生活中,考试是必不可少的一部分。然而,有时候我们在做完试卷后发现自己填错了答案,或者想要更改答案,但是试卷上已经有了痕迹。这时候,我们就需要一些工具来擦除答案。以下是几个简单的步骤,让…

[每周一更]-(第58期):选购佳能变焦镜头 EF-S 18-200mm F/3.5-5.6 IS的心得

参考地址: https://www.canon.com.cn/purchase/onlinesale/index3.html?typejdhttps://www.canon.com.cn/overview/efwidezoom.html 讲在买之前 由于没有买全画幅,买了残幅,好处是能选的镜头有限,不用太费钱了,需要…

C和C++的区别(6)字符串

目录 一,字符 二,C语言字符串 1,字符串的表示 2,输入输出 3,常用函数 三,string类 1,定义,初始化,输入输出 一,字符 类型:char 输入&…

sealos安装k8s

一、前言 1、我前面文章有写过使用 kubeadm 安装的方式,大家可以去参考 (二)k8s集群安装,有一系列的k8s文章说明 2、安装k8s的方式有很多 kubeadmsealoskubespray等等 3、关于sealos来安装 k8s ,也是非常建议大家去…

ACM输入总结

目录 一,输入结构 1,一级输入结构 2,嵌套输入结构 二,一级输入结构 HDU 1089 AB for Input-Output Practice (I) HDU 1090 AB for Input-Output Practice (II) HDU 1091 AB for Input-Output Practice (III) HDU 1095 AB …

浅谈智慧消防助力现代社会火灾防控 安科瑞 顾语欢

摘 要:随着我国经济水平的不断提高,科学技术取得了长足进步。科学技术的进步推动着社会不断前进,改变了各行各业的人们的生活。随着各种新型的技术尤其是人工智能技术的出现,社会进入了智能化时代。消防作为维护我们生活的一道重要…

ava算法_ 跳跃游戏(LeetCode_Hot100)

题目描述:给你一个非负整数数组 ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。nums 判断你是否能够到达最后一个下标,如果可以,返回 ;否则,返回 。truefalse 获得更…

[保研/考研机试] KY7 质因数的个数 清华大学复试上机题 C++实现

描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如1202*2*2*3*5&#xff0c;共有5个质因数。 输入描述&#xff1a; 可能有多组测试数据&#xff0c;每组测试数据的输入是一个正整数N&#xff0c;(1<N<10^9)。 输出描述&#xff1a; 对于每组数…

vite+vue3项目环境搭建

1.安装 npm init vite 2.输入项目名称 vue3-project 3.选择框架 说明&#xff1a;vue 4.选择类别 说明&#xff1a;JavaScript 5.进入文件夹 cd vue3-project yarn npm run dev 6.打开local

十种排序算法(附动图)

排序算法 一、基本介绍 ​ 排序算法比较基础&#xff0c;但是设计到很多计算机科学的想法&#xff0c;如下&#xff1a; ​ 1、比较和非比较的策略 ​ 2、迭代和递归的实现 ​ 3、分而治之思想 ​ 4、最佳、最差、平均情况时间复杂度分析 ​ 5、随机算法 二、排序算法的分类 …

【LeetCode-中等】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景 在日常开发过程中&#xff0c;我们会遇到图片懒加载的功能&#xff0c;基本原理是&#xff0c;滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢&#xff1f;滚动条滚动到底部触发时间的时机和方法又该怎样定义&#xff1f; 针对以上问题我…

WinServer2016 DHCPv6部署

Windows Server 2016 部署 DHCPv6 应用场景&#xff1a;如果服务器的 idrac 地址配置之后忘记了&#xff0c;又无法不能重启服务器&#xff0c;可以通过 DHCPv6 来解决。因为服务器 idrac 的 ipv6 自动获取是默认开启的&#xff0c;那么可以用笔记本装个 windwos server 的系统…

Vue2 实现购物车功能(可直接使用)

目录 vue2.0实例简单购物车代码实现 vue2.0实例简单购物车 页面展示效果如下&#xff1a;​ 该购物车实现了自动计算小计、总价。 代码实现 <body><div id"app"><div><form action"">商品名称:<input type"text" …

卡巴斯基为基于Linux的嵌入式设备推出专用解决方案

导读卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持。这种适应性强的多层解决方案现在为基于Linux的嵌入式系统、设备和场景提供优化的安全&#xff0c;合通常适用于这些系统的严格监管标准。 卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持…

编程小白必看!Visual Studio 2022详细安装使用教程(C/C++编译器)

目录 【前言】 一、Visual Studio 2022简介 二、Visual Studio 2022下载安装 1.Visual Studio 2022下载地址 2.Visual Studio 2022安装 2.1下载完成后点击打开安装 2.2安装完毕以后需要重启软件&#xff0c;点击确定。 三、Visual Studio 2022使用教程 【最后】 &#x…

分享一颗能用在TYPE-C接口取电协议芯片LDR6328Q,方便好用

芯片功能&#xff1a;诱导PD充电器输出最大功率&#xff0c;支持最大诱骗20V电压。支持协议&#xff1a;PD/QC/三星AFC/华为SCP等主流快充协议 芯片封装&#xff1a;QFN16,SOP8多封装选择 芯片应用&#xff1a; 桶形连接器替换&#xff08;BCR&#xff09;&#xff0c;USB-A和m…

ABAP: SQL 多值查询

基础查数据 问题举例&#xff1a;例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询&#xff0c;三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…

模型训练----将日志输出为txt

1、写入txt 在云服务器上训练模型的时候&#xff0c;防止不显示输出&#xff0c;可以将训练日志写入txt import logging#初始化文件&#xff0c;filemodew每次覆盖文件 logging.basicConfig(filename./log.txt,format %(asctime)s - %(name)s - %(levelname)s - %(message)s-…

笔记本电脑合上盖后重新打开(秒开)处理方案

原因&#xff1a;合上盖默认进入休眠&#xff0c;电脑内存进入运存&#xff0c;重新打开数据重新传入内存&#xff0c;时间很长&#xff0c; 方案&#xff1a;将休眠模式改为从不即可