【面试题】如何合理的设置线程池中的参数

一、ThreadPoolExecutor 的重要参数

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {
}
  1. corePoolSize(核心线程数)

    • 核心线程会一直存活,即使没有任务需要执行。
    • 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理任务。
    • 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
    • 根据任务类型(CPU 密集型或 IO 密集型)以及机器的 CPU 核数来设置。
      • CPU 密集型:需要大量的CPU计算,所以corePoolSize = CPU 核数 + 1
      • IO 密集型:需要去到磁盘进行读取,速度会比CPU运算更快corePoolSize = CPU 核数 * 2
  2. maximumPoolSize(最大线程数)

    • 当线程数大于等于核心线程数且任务队列已满时,线程池会创建新线程来处理任务。
    • 当线程数等于最大线程数且任务队列已满时,线程池会拒绝处理任务而抛出异常。
  3. keepAliveTime(线程空闲时间)

    • 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量等于核心线程数。如果allowCoreThreadTimeout=true,则会直到线程数量为 0。
  4. queueCapacity(任务队列容量,阻塞队列)

    • 当核心线程数达到最大时,新任务会放在队列中排队等待执行。
  5. allowCoreThreadTimeout(允许核心线程超时)

    • 控制核心线程是否可以超时关闭。
  6. rejectedExecutionHandler(任务拒绝处理器)

    • 当线程数已经达到最大线程数且队列已满,或者线程池被调用shutdown()后提交任务,会拒绝新任务。
    • ThreadPoolExecutor 采用策略设计模式处理拒绝任务的场景,有多种策略可供选择:
      • AbortPolicy:丢弃任务,抛运行时异常。
      • CallerRunsPolicy:执行任务。
      • DiscardPolicy:忽视,什么都不会发生。
      • DiscardOldestPolicy:从队列中踢出最先进入队列(最后一个执行)的任务。

二、如何设置参数

  1. 首先确定几个值:

    • tasks:每秒的任务数,假设为 500 - 1000。
    • taskcost:每个任务花费时间,假设为 0.1s。
    • responsetime:系统允许容忍的最大响应时间,假设为 1s。
  2. 计算核心线程数:

    • threadcount = tasks / (1 / taskcost) = tasks * taskcost = (500 ~ 1000) * 0.1 = 50 ~ 100个线程。核心线程数应大于 50,根据 8020 原则,如果 80%的每秒任务数小于 800,那么核心线程数设置为 80 即可。
  3. 计算任务队列容量:

    • queueCapacity = (coreSizePool / taskcost) * responsetime。例如,核心线程数为 80 时,队列容量为 80/0.1*1 = 800。这意味着队列里的线程可以等待 1s,超过了的需要新开线程来执行。
  4. 最大线程数在生产环境上往往设置成与核心线程数一样,这样可以减少在处理过程中创建线程的开销。

  5. rejectedExecutionHandler根据具体情况来决定任务拒绝策略,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理。

  6. keepAliveTimeallowCoreThreadTimeout采用默认通常能满足。实际情况要根据机器性能来调整,如果在未达到最大线程数的情况机器 CPU load 已经满了,则需要通过升级硬件和优化代码,降低taskcost来处理。

三、线程池队列的选择

  1. 无界队列

    • 常用的为无界的LinkedBlockingQueue。使用此队列作为阻塞队列时要当心,当任务耗时较长时可能会导致大量新任务在队列中堆积最终导致内存溢出(OOM)。
    • 当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列,例如在 Web 页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。但此时maximumPoolSize的值也就无效了。
  2. 有界队列

    • 常用的有两类,一类是遵循先进先出(FIFO)原则的队列如ArrayBlockingQueue,另一类是优先级队列如PriorityBlockingQueue
    • 使用有界队列时队列大小需和线程池大小互相配合,线程池较小有界队列较大时可减少内存消耗,降低 CPU 使用率和上下文切换,但是可能会限制系统吞吐量。
  3. 同步移交队列

    • 如果不希望任务在队列中等待而是希望将任务直接移交给工作线程,可使用SynchronousQueue作为等待队列。
    • SynchronousQueue不是一个真正的队列,而是一种线程之间移交的机制。只有在使用无界线程池或者有饱和策略时才建议使用该队列。

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

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

相关文章

路由器如何绑定三层 trunk 接口

一、拓扑&#xff1a; 二、配置思路&#xff1a; 1、AR1、2 起 eth-trunk X&#xff08;AR系列中&#xff0c;X范围0-7&#xff09; 2、改变接口由二层到三层 3、配置 Porttrunk 范围 4、起三层地址 三、配置内容&#xff1a; [AR1]: interface Eth-Trunk0undo portswitchip…

[项目:微服务即时通讯系统客户端(基于C++QT)]三,左侧界面搭建

三&#xff0c;左侧界面搭建 一&#xff0c;导入 先把MainWidget类做成“单例类” 采用的是单例模式&#xff0c;让某一个类&#xff0c;在指定进程中只有唯一的实例 先看一下MainWidget的框架 QWidget//这部分是头文件保护宏&#xff0c;确保该头文件只被包含一次&#x…

NSSCTF刷题篇1

js类型 [SWPUCTF 2022 新生赛]js_sign 这是一道js信息泄露的题目直接查看源码&#xff0c;有一个main.js文件点击之后&#xff0c;有一串数字和一段base64编码&#xff0c;解开base64编码得到这个编码为敲击码 解码在线网站&#xff1a;Tap Code - 许愿星 (wishingstarmoye.…

Fyne ( go跨平台GUI )中文文档- 扩展Fyne (七)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

百度amis框架经验分享

百度amis框架经验分享 官方文档 amis - 低代码前端框架 这篇文章讲了amis的设计 为什么说百度AMIS框架是一个优秀的设计_百度前端框架-CSDN博客 学习方法&#xff1a; 最好的学习方法就是GPT官方文档 不要去很大力气通读官方文档&#xff0c;大概浏览一遍就行&#xff0c; 以你…

VisionPro - 基础 - 模板匹配技术-Search/PMAlign/PatMax(6)-纹理屏蔽和重叠匹配

前言&#xff1a; 1 特征掩膜屏蔽&#xff1a; 模板匹配的应用中&#xff0c;去除非感兴趣的区域&#xff0c;或者去除一些枝端末节的特征&#xff0c;突出需要的主特征的匹配是一个基本原则。这一节&#xff0c;介绍了PatMax的一些处理方法&#xff1a; 2 重叠匹配 1 Ignor…

【HTTPS】中间人攻击和证书的验证

中间人攻击 服务器可以创建出一堆公钥和私钥&#xff0c;黑客也可以按照同样的方式&#xff0c;创建一对公钥和私钥&#xff0c;冒充自己是服务器&#xff08;搅屎棍&#xff09; 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的&#xff0c;服务器能生产&…

工程车辆目标检测、程车检测算法、工程车辆类型检测算法

工程车检测算法主要用于智能交通系统、建筑工地管理、矿山开采、物流运输等领域&#xff0c;通过图像识别技术来检测和识别工程车&#xff0c;以提高安全管理、交通流量管理和资源调度的效率。以下是关于工程车检测算法的技术实现、应用场景及优势的详细介绍。 一、技术实现 工…

nuget包管理

1、下载 下载nuget 下载nuget.exe&#xff0c;配置系统环境变量&#xff0c;打开电脑属性一高级系统设置一环境变量一系统变量&#xff0c;选择Path&#xff0c;添加nuget.exe目录 2、常用命令 nuget install System.Data.SQLITE -SolutionDirectory D:\NugetPackages\ -Packa…

生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队指导设计、解读实验结果。

查看原文>>>生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队免费指导设计、解读实验结果、一台服务器解决您所有的分析困扰!

CUDA-纹理内存

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 纹理内存是什么&#xff1f; 在 GPU 编程中&#xff0c;纹理内存是一种专门用于二维和三维数据读取的存储方式&#xff0c;特别适…

[SAP ABAP] 数据字典外键关联

SE11创建自定义数据库表 学校表(ZDBT_SCH_437) 表有3个组成字段&#xff1a; ① MANDT (参考数据元素为MANDT&#xff0c;主键) ② SCHID 学校ID (参考新建数据元素ZDE_SCHID_437&#xff0c;主键&#xff0c;NUMC4) ③ SCHNAME 学校名称 (CHAR20) 学生表(ZDBT_STU_437) 表有7个…

基于微信小程序校园订餐的设计与开发+ssm(lw+演示+源码+运行)

摘 要 人民生活水平的提高就会造成生活节奏越来越快&#xff0c;很多人吃饭都采用点外卖的方式。现在点外卖的平台已有很多&#xff0c;大多都需要安装它们的APP才可以使用&#xff0c;并且没有针对校园。如果一味的使用外卖平台不仅会造成商家成本的增加&#xff0c;还不利于…

基于微信小程序的智慧物业管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

目录 1.两个基本的结构体搭建 2.实现push_back函数 3.关于list现状的分析&#xff08;对于我们如何实现这个迭代器很重要&#xff09; 3.1和string,vector的比较 3.2对于list的分析 3.3总结 4.迭代器类的封装 5.list容器里面其他函数的实现 6.个人总结 7.代码附录 1.两…

easylogger移植

1.源码 GitHub - armink/EasyLogger: An ultra-lightweight(ROM<1.6K, RAM<0.3k), high-performance C/C log library. | 一款超轻量级(ROM<1.6K, RAM<0.3k)、高性能的 C/C 日志库 2.介绍 easylogger就是用来打印日志的,我们可以将日志输出到sscom, led屏幕, 或者…

多模态交互才是人机交互的未来

交互方式 在探讨文字交流、语音交流和界面交流的效率时&#xff0c;我们可以看到每种方式都有其独特的优势和局限性。文字交流便于记录和回溯&#xff0c;语音交流则在表达情绪和非语言信息方面更为高效&#xff0c;而界面交流则依赖于图形用户界面&#xff08;GUI&#xff09…

[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?

1. 论文简介 论文《Can VLMs Play Action Role-Playing Games? Take Black Myth Wukong as a Study Case》是阿里巴巴集团的Peng Chen、Pi Bu、Jun Song和Yuan Gao&#xff0c;在2024.09.19提交到arXiv上的研究论文。 论文: https://arxiv.org/abs/2409.12889代码和数据: h…