java线程池参数及合理设置

java线程池参数及合理设置

线程池的7大核心参数

corePoolSize

  • 核心线程数目核心线程会一直存活,及时没有任务需要执行,当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理当设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭

maximumPoolSize 最大线程数目

  • 当空闲线程时间达到 keepAliveTime,线程会关闭,直到数量等于corePoolSize

keepAliveTime空闲时间

unit 时间单位

  • 超过核心线程的生存时间单位,如秒、毫秒等。

workQueue 阻塞队列

  • LinkedBlockingQueue:无界队列,容量Integer.MAX_VALUE,(FixedThreadPool 和 SingleThreadExecutor 线程池的线程数是固定的,用的就是LinkedBlockingQueue)
  • SynchronousQueue:直接提交的任务队列(CachedThreadPool 的最大线程数是 Integer.MAX_VALUE,用的是SynchronousQueue)
  • ArrayBlockingQueue:指定队列大小(corePoolSize >队列>maximumPoolSize )

threadFactory 线程工厂

  • 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等。

handler 拒绝策略

  • AbortPolicy:终止策略。超过最大承载、执行拒绝任务时,会直接抛出一个类型为RejectedExecutionException 的 RuntimeException异常
  • CallerRunsPolicy:调用者执行策略。超过承载,执行策略时,调用者线程执行任务。
  • DiscardOldestPolicy:丢弃最早任务策略。超过承载,丢弃队列中最早的任务。若线程池关闭,则舍弃。
  • DiscardPolicy:丢弃策略。超过承载,丢弃任务。
  • 实现RejectedExecutionHandler接口,自定义策略

线程池参数的合理设置

  • tasks,程序每秒需要处理的最大任务数量
  • tasktime,单线程处理一个任务所需要的时间
  • responsetime,系统允许任务最大的响应时间

corePoolSize

  • 每个任务需要tasktime秒处理,则每个线程每秒可处理1/tasktime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为:tasks/(1/tasktime)。即tasks*tasktime个线程数。具体数字最好根据8020原则,即80%情况下系统每秒任务数

queueCapacity:任务队列的长度

  • 任务队列的长度要根据核心线程数,以及系统对任务响应时间的要求有关。队列长度可以设置为(corePoolSize/tasktime)responsetime

maxPoolSize:最大线程数

  • 当系统负载达到最大值时,核心线程数已无法按时处理完所有任务,这时就需要增加线程。每秒200个任务需要20个线程,那么当每秒达到1000个任务时,则需要(1000-queueCapacity)*(20/200)。

keepAliveTime

  • keepAliveTiime设定值可根据任务峰值持续时间来设定。
  • 以上关于线程数量的计算并没有考虑CPU的情况。若结合CPU的情况,比如,当线程数量达到50时,CPU达到100%,则将maxPoolSize设置为60也不合适,此时若系统负载长时间维持在每秒1000个任务,则超出线程池处理能力,应设法降低每个任务的处理时间(tasktime)。

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

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

相关文章

目标检测YOLO实战应用案例100讲-多目标检测及追踪(续)

目录 3.3 改进CenterNet网络(Improved-CenterNet) 3.3.1多特征融合模块的设计 3.3.2 DCN模块设计

关键字、标志符、变量

1、关键字 1.1、定义 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(或单词) 特点:全部关键字都是小写字母 上源码: 代码中定义类的关键字class,定义一个订单控制器类 ​​​​​​​…

【Unity美术】如何用3DsMax做一个水桶模型

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

echarts图表会残留上一条数据的折线 setOption参数的第二个坑

记一下小坑 因为我的echarts图表的 series 是循环渲染上去的 所以他可能会有一条 或多条 我展示完多条的图表后 关闭 打开单条数据的图表 发现 他会残留上一个图表的数据 显示多条 之前我还以为是后端返回错了 但是log打印和查看请求数据 确实发现是我这边的问题 原因&#…

【Java集合篇】HashMap的hash方法是如何实现的?

HashMap的hash方法是如何实现的? ✔️ 典型解析✔️ 拓展知识仓✔️ 使用&代替%运算✔️扰动计算 ✔️ 典型解析 hash 方法的功能是根据 Key 来定位这个K-V在链表数组中的位置的。也就是hash方法的输入应该是个Object类型的Key,输出应该是个int类型的数组下标。…

Kibana相关问题及答案(2024)

1、如何在Kibana中创建一个仪表板? 在Kibana中创建一个仪表板涉及到在其界面中完成几个主要步骤的过程。这里是详细的分步指南: 第 1 步:设计和规划 在你开始之前,思考以下问题将帮助你设计高效的仪表板: 数据源&a…

Redis底层原理篇(SDS与IntSet)

1.SDS动态字符串 2.intSet contents[]整数数组存的是地址 具备有序的特性 有自动扩容机制,自动扩容时倒序赋值

StarRocks 在小红书自助分析场景的应用与实践

作者:小红书 OLAP 研发负责人 王成 近两年 StarRocks 一直是小红书 OLAP 引擎体系里非常重要的部分,过去一年,小红书的 StarRocks 使用规模呈现出翻倍的增长速度,目前整体规模已经达到 30 个集群,CPU 规模已经达到了 3…

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

GitHub pull request(傻瓜式入门版)

基础入门版 pull request一、fork项目二、clone代码到本地三、进入到克隆的项目目录下四、列出所有分支五、创建一个本地分支,并追踪远程项目分支六、查看当前分支七、与远程仓库建立连接八、与上游仓库建立连接八、同步最新代码九、修改代码并提交十、提交pr pull …

Java常用类---Object类-->Clone方法

Object类 理论上Object类是所有类的父类,所有类都直接或间接的继承java.lang.Object类。因此省略了extends Object关键字。 Object类中具体方法如下图所示: 其中,部分绿色小锁子图标,如:getClass()、notify()、notif…

点云从入门到精通技术详解100篇-基于深度学习的室内场景三维点云语义分割(续)

目录 CSegNet 语义分割模型构建 3.1 引言 3.2 偏移注意机制 3.3 网络主干 3.4 边缘卷积模块

Redis的基本命令和数据类型

Redis支持多种数据类型,每种类型都有一套相应的命令来进行操作。了解和熟练使用这些基本命令和数据类型是深入学习Redis的基础,下面详细介绍这些基本数据类型和相关命令: 1. 字符串(String) 基本概念:字符…

springMVC获取请求参数的方式

文章目录 springmvc获取参数的方式1、ServletAPI获取参数(原生态)2、通过控制器的形参取值3、 RequestParam4、通过POJO获取请求参数 springmvc获取参数的方式 1、ServletAPI获取参数(原生态) 将HttpServletRequest作为控制器方…

从0开始python学习-41.requsts中session关联接口

问题:在多接口测试中,存在接口token等参数需要关联的情况,为了避免无法进行关联或者错误关联及写很多冗余代码的情况。采用session的方式进行接口关联 作用:requests库的session会话对象可以跨请求保持某些参数,Reque…

新晋程序员的2023:挫折、收获与未来展望

2023年,对我而言,是一个崭新的开端,也是一个丰富的挑战。毕业后,我跌跌撞撞走入了编程世界,虽然这年经历了很多坎坷,但也收获了许多。让我向你们介绍一下我刚毕业的这一年的编程之旅。 我与编程的故事开始…

前缀和(用于计算某数组区间的总和)

目录 前缀和思路:代码: 原题链接 前缀和 输入一个长度为 n 的整数序列。 接下来再输入 m 个询问,每个询问输入一对 l,r 。 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。 输入格式 第一行包含两个整数 n 和 m 。 第…

SPRING BOOT发送邮件验证码(Gmail邮箱)

SPRING BOOT邮件发送验证码 一、Gmail邮箱配置 1、进入Gmail(https://mail.google.com) 2、打开谷歌右上角设置 3、启用POP/IMP 4、启用两步验证(https://myaccount.google.com/security) 5、建立应用程式密码 6、复制保存应用程式密码 二、代码 1、引入依赖 <d…

Java并发集合详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在这篇博客中&#xff0c;咱们将一起深入探索Java中的并发集合。多线程编程是一个不可或缺的部分&#xff0c;它能让程序运行得更快&#xff0c;处理更多的任务。但同时&#xff0c;多线程也带来了一些挑战&…

服务器RAID管理之MegaRaid工具

一、简介 MegaCli是一款管理维护硬件RAID软件&#xff0c;可以通过它来了解当前raid卡的所有信息&#xff0c;包括 raid卡的型号&#xff0c;raid的阵列类型&#xff0c;raid 上各磁盘状态等等。通常&#xff0c;我们对硬盘当前的状态不太好确定&#xff0c;一般通过机房人员巡…