线程池参数如何设置

线程池参数设置

hello丫,各位小伙伴们,好久不见了!

下面,我们先来复习一下线程池的参数

1、线程池参数有哪些?

  • corePoolSize(核心线程数):线程池中的常驻核心线程数。即使这些线程处于空闲状态,它们也不会被销毁。除非设置了allowCoreThreadTimeOut,否则核心线程在空闲时也不会被终止。

  • maximumPoolSize(最大线程数):线程池中允许的最大线程数。当工作队列已满,并且正在执行的线程数等于corePoolSize时,线程池会创建新的线程来处理任务,直到线程数达到maximumPoolSize。

  • keepAliveTime(线程空闲时间):当线程数大于corePoolSize时,这是多余空闲线程等待新任务的最长时间。超过这个时间后,多余的空闲线程将被终止。这个参数帮助减少系统资源消耗。

  • unit(时间单位):keepAliveTime参数的时间单位,例如SECONDS、MILLISECONDS等。

  • workQueue(任务队列):用于保存等待执行的任务的阻塞队列。当所有核心线程都在工作,新提交的任务会被添加到这个队列中等待执行。队列的类型(例如ArrayBlockingQueue、LinkedBlockingQueue或SynchronousQueue)会影响线程池的行为。

  • threadFactory(线程工厂):用于创建新线程的工厂,它提供了定制新线程的方式,例如设置线程名、是否为守护线程等。

  • handler(拒绝策略):当线程池无法处理新任务时(例如,任务队列已满,且线程数已达到maximumPoolSize),这个策略定义了应该如何处理。Java提供了几种内置的拒绝策略,如AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行任务)、DiscardOldestPolicy(丢弃队列中最老的任务)和DiscardPolicy(直接丢弃任务)。也可以根据需要实现自定义的拒绝策略。

2、线程池核心线程数和最大线程数怎么设置?

  • 分为CPU密集型IO密集型

  • CPU这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。

  • IO密集型 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占 用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们 可以多配置一些线程,具体的计算方法可以是 :核心线程数=CPU核心数量*2

  • 最大线程数 一般设置为核心线程数的2~3倍,这个数值是不固定的

实际工程经验可能并不是严格按照这个来的,我们要根据实际开发场景来设置。

3、如何获取CPU核数

Runtime.getRuntime().availableProcessors();

4、线程池工作流程(原理)

通俗易讲来说就是:

内部是通过队列+线程实现的,当我们利用线程池执行任务时,如果此时线程池中的线程数量小于corePoolSize(核心线程数),即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务,如果此时线程池中的线程数量等于corePoolSize,但是阻塞队列(LinkedBlockingQueue)未满,那么任务被放入阻塞队列。如果此时线程池中的线程数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolize,建新的线程来处理被添加的任务。如果此时线程池中的线程数量大于corePolSize,缓冲队列workQueue满。并且线程池中的数量等于maximumPoolize,那么通过 handler所指定的策略来处理此任务。当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数

5、那么再来复习一下线程池的4中拒绝策略

  •  AbortPolicy。这是线程池的默认策略。当任务被拒绝时,它会抛出`RejectedExecutionException`异常。这种方式直接告知任务被拒绝,开发者可以根据业务逻辑决定是否重试或放弃提交新任务。
  • DiscardPolicy。在这种策略下,当新任务被提交时,如果线程池无法处理,将被直接丢弃,不会有任何通知。这种策略适用于对任务执行不敏感的场景,因为它可能会导致数据丢失。
  • DiscardOldestPolicy。如果线程池未关闭且无法执行新任务,则会丢弃任务队列中的最老任务(即存活时间最长的任务),然后可能尝试重新提交被拒绝的任务。这种策略旨在腾出空间给新提交的任务,但同样存在数据丢失的风险。
  • CallerRunsPolicy。当有新任务提交且线程池无法执行时,该策略会让提交任务的线程直接执行该任务。这提供了最完善的处理方式,因为它避免了任务丢失,但可能会因为任务提交速度过快而导致程序阻塞。
     

6、如何合理设置线程池的大小:


想要合理配置线程池线程数的大小,需要分析任务的类型,任务类型不同,线程池大小配置也不同。

配置线程池的大小可根据以下几个维度进行分析来配置合理的线程数:

任务性质可分为:CPU密集型任务,IO密集型任务,混合型任务。
任务的执行时长。
任务是否有依赖——依赖其他系统资源,如数据库连接等。
CPU密集型任务
尽量使用较小的线程池,一般为CPU核心数+1。
因为CPU密集型任务使得CPU使用率很高,若开过多的线程数,只能增加上下文切换的次数,因此会带来额外的开销。

IO密集型任务
可以使用稍大的线程池,一般为2*CPU核心数+1。
因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量,因此可以让CPU在等待IO的时候去处理别的任务,充分利用CPU时间。

混合型任务
可以将任务分成IO密集型和CPU密集型任务,然后分别用不同的线程池去处理。
只要分完之后两个任务的执行时间相差不大,那么就会比串行执行来的高效。
因为如果划分之后两个任务执行时间相差甚远,那么先执行完的任务就要等后执行完的任务,最终的时间仍然取决于后执行完的任务,而且还要加上任务拆分与合并的开销,得不偿失

依赖其他资源
如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU。

到这里就结束,感谢大家的支持!!!我会继续努力的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型日报#0411:国内首款音乐大模型、面壁智能数亿融资、MyScale AI开源

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 ​标题: 大模型做时序预测也很强!华人团队激活LLM新能力,超越一众传统模型实现SOTA 摘要: 大语言模型通过新提…

Vue结合el-table实现合并单元格(以及高亮单元表头和指定行)

实现效果如下: 思路: 1.首先使用动态表头表格。 2.其次实现动态计算合并单元格。(计算规则 传递需要合并的字段) 3.然后封装公共的计算单元格方法 export导出供多个页面使用。 4.同时需要封装成公共的组件供多个页面使用。 5…

PostgreSQL入门到实战-第十九弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(三)官网地址PostgreSQL概述PostgreSQL中INNER JOIN命令理论PostgreSQL中INNER JOIN命令实战更新计划 PostgreSQL中表连接操作(三) 使用PostgreSQL INNER JOIN子句从多个表中选择数据。 官网地址 声明: 由于操作系统, 版本更新等…

Innodb架构解析

整体架构 通过《面试官:一条SQL是如何执行的?》我们了解了MySQL架构,下面我们看下Innodb架构。 innodb最早由Innobase Oy公司开发,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引…

电子元器件商城开发用什么技术框架?

随着信息技术的飞速发展,电子元器件商城已成为电子工程师和采购人员获取元器件的重要渠道。电子元器件商城的开发涉及众多技术和开发语言的选择,本文将详细分析电子元器件商城开发中常用的技术和开发语言,以及它们各自的优势。 一、电子元器…

“我哭死!用ChatGPT完成的硕士论文被评不及格……”

我隔壁专业用ChatGPT写的论文被老师判不及格了,大家还是慎用吧! 匿名 自从去年11月份ChatGPT面世以来,因为它天然适合撰写学术论文,越来越多的同学开始使用它辅助论文写作。 学习写作有所谓的鲁迅体、莫言体、余华体,但…

从头开发一个RISC-V的操作系统(三)编译与链接

文章目录 前提GCCGCC简介GCC的主要执行步骤GCC涉及的文件类型 ELFELF简介ELF文件格式ELF文件处理工具:Binutils 练习参考链接 目标:通过这一个系列课程的学习,开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文…

[StartingPoint][Tier2]Vaccine

Task 1 Besides SSH and HTTP, what other service is hosted on this box? (除了SSH和HTTP,这个盒子上还托管了什么其他服务) # nmap -sS -T4 10.129.230.43 --min-rate 1000 ftp Task 2 This service can be configured to allow login with any password fo…

SAP HCM get pernr无法查询到主数据

今天遇到一个比较奇怪的问题,就是ger pernr在2月的时候能找到员工主数据,但是在3月的时候无法找到员工主数据。首先SE36:逻辑数据库页面,看看标准逻辑数据库执行,是否能获取数据。 从上述标准的逻辑书而言,…

Linux操作系统的学习

Linux系统的目录结构 / 是所有目录的顶点目录结构像一颗倒挂的树 Linux常用命令 常见命令 序号命令对应英文作用1lslist查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在,新…

深度学习每周学习总结P4(猴痘识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 –来自百度网盘超级会员V5的分享 目录 0. 总结1. 数据导入部分2. 划分数据集3. 模型构建部分3.1 模型构建3.2 公式推导 4. 设置超参数5. …

HTTP请求报文介绍

本章简要介绍渗透测试员在攻击Web应⽤程序时可能遇到的关键技术。 将分析HTTP协议、服务器和客⼾端常⽤的技术以及⽤于在各种情形下呈现数据的编码⽅案。 这些技术⼤都简单易懂,掌握其相关特性对于向Web应⽤程序发动有效攻击极其重要。 1.1 HTTP协议概述介绍 HTT…

【学习笔记】R语言入门与数据分析1

数据分析 数据分析的过程: 数据采集 数据存储 数据分析 数据挖掘 数据可视化 进行决策 数据挖掘 数据量大 复杂度高,容忍一定的误差限 追求相关性而非因果性 数据可视化 直观明了 R语言介绍 R是免费的(开源软件、扩展性好)…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列,类使用C/C中的数组,使用 [ ] 定义列表,列表中的元素与元素之间用英文逗号( , )分隔, 但是Python中列表可以存储任意类型的数据,且可以混存(即类型可以…

Socks5代理IP使用教程

当我们在互联网上浏览网页、下载文件或者进行在线活动时,隐私和安全问题常常被提及。在这样的环境下,一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法,帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

220 基于matlab的考虑直齿轮热弹耦合的动力学分析

基于matlab的考虑直齿轮热弹耦合的动力学分析,输入主动轮、从动轮各类参数,考虑润滑油温度、润滑油粘度系数等参数,输出接触压力、接触点速度、摩擦系数、对流传热系数等结果。程序已调通,可直接运行。 220直齿轮热弹耦合 接触压力…

医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS

目录 ​移动手术工作站 主要解决的问题 主要硬件设备的对接 技术架构 手麻系统功能 手术进程 手术排班 手术记录 术前访视与评估 术中麻醉记录 麻醉总结 术后访视 模版配置 自动评分 文书模板 手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进…

三次 Bspline(B样条曲线) NURBS曲线的绘制 matlab

先来了解几个概念: 1.1 节点向量: B-Spline需要定义曲线的节点向量U,它可以对应到Bezier曲线的参数u。 其元素个数 (m1) 和曲线阶数 k 、控制点个数n满足:m1k1n1 如果U的每段的距离是相等,那么这个B-Spline就被称为均…

亚马逊云的账单申诉

亚马逊云科技申诉通常涉及几个步骤,目的是解决账单错误或申请费用调整。以下是一个基本的指南,可以帮助你开始处理账单问题: 1. 审核账单 在开始申诉之前,首先登录到亚马逊云科技管理控制台。 导航到“账单仪表板”以查看当前的…

模型训练-保存训练数据

1.目的 找到一个可运行的代码,可以每个epoch打印训练数据,但是不会保存。因为在改进模型需要这些训练数据进行对比,所以需要将每个epoch的训练数据保存下来,写到一个文件中。 2.解决方案 直接问ChatGPT,提示词如下&…