【JUC】ThreadPoolExecutor 合理的配置线程池的大小

颠覆性创新的测量框架与跨领域实证分析 颠覆性创新作为科技发展的重要驱动力,其核心在于实现知识体系的范式转换。从技术原理看,这类创新通常具备知识替代、网络重构和跨领域渗透三大特征,通过引用网络分析和文本挖掘等方法可量化评估其影响力。在工程实践中,CD指数、DI指数等测量工具帮助研究者识别具有突破潜力的成果,而深度学习等新兴技术进一步提升了评估精度。当前AI、半导体等领域的热门技术发展表明,模块化架构和产业协同能有效促进颠覆性创新。面对全球范围内创新颠覆性下降的趋势,优化科研评价体系、构建跨学科协作网络成为关键应对策略。 阅读详情

受限于硬件、内存和性能,我们不可能无限制的创建任意数量的线程,每一台机器允许的最大线程是一个有界值。因此ThreadPoolExecutor管理的线程数量是有界的。线程池就是用这些有限个数的线程,去执行提交的任务。但是对于多用户、高并发的应用来说,提交的任务数量非常巨大,会比允许的最大线程数多很多。为了解决这个问题,必须要引入排队机制,或者是在内存中,或者是在硬盘等容量很大的存储介质中。Java的ThreadPoolExecutor只支持任务在内存中排队,通过BlockingQueue暂存还没有来得及执行的任务。

线程的管理是比较复杂的,这会涉及线程数量、等待/唤醒、同步/锁、线程创建和死亡等问题。

ThreadPoolExecutor中的这七大参数,共同负责着线程池中的线程的创建和销毁

  • int corePoolSize
  • int maximumPoolSize
  • long keepAliveTime
  • TimeUnit unit
  • BlockingQueue workQueue
  • ThreadFactory threadFactory
  • RejectedExecutionHandler handler

方式一 根据计算任务的性质

  • 任务的性质 CPU密集型任务 IO密集型任务 混合型任务

  • 任务的优先级 高 中 低

  • 任务的执行时间 长 中 短

  • 任务的依赖性 是否依赖其他系统资源 如,数据库连接等

性质不同的任务可以交给不同规模的线程池执行

CPU密集型任务 应配置尽可能小的线程 如, 配置 CPU个数+1 的线程数

IO密集型任务 应配置尽可能多的线程,因为IO操作不占用CPU,不要让CPU闲下来,应加大线程数量 如, 配置 两倍CPU个数+1

混合型的任务 如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行的时间是差不多的,如果处理时间相差很大,则没必要拆分了

其他系统资源有依赖的任务,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU空闲的时间越长,那么线程数量应设置得越大,才能更好的利用CPU
合理设置线程池值大小,需要结合系统实际情况大量的尝试和比较去得出合理的设置大小

最佳线程数目 = ((线程等待时间 + 线程CPU时间)/ 线程CPU时间 )* CPU数目

如, 平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8
那么根据上面这个公式估算得到:((0.5 + 1.5) / 0.5) * 8 = 32

这个公式进一步转化为:
最佳线程数目 = ((线程等待时间 / 线程CPU时间) + 1)* CPU

结论:

  • 线程等待时间所占比例越高,需要越多线程
  • 线程CPU时间所占比例越高,需要越少线程

以上公式与CPU和IO密集型任务设置线程数基本吻合。

  • 高并量发、任务执行时间短的业务怎样设置线程池?

    CPU核数+1 减少线程上下文的切换

  • 高并量发、任务执行时间长的业务怎样设置线程池?

    解决这种类型任务的瓶颈往往不在于线程池而在于整体架构的设计
    1、看看这些业务里面某些数据是否能做缓存
    2、是否需要增加服务数量
    3、考虑线程池的设置
    4、能否使用中间件对任务进行拆分和解耦

  • 并发不高、任务执行时间长的业务怎样设置线程池?

    IO密集型的任务 加大线程池中的线程数目,让CPU处理更多的业务
    计算密集型任务 CPU核数+1 减少线程上下文的切换

方式二

参考

1.java 线程常用工具类

2:线程的生命周期

3:多线程的理解

4:线程池的运行机制

5:线程池中变量的定义

6.corePoolSize和maxPoolSize的区别

7:线程池中的阻塞队列无限大是否合适

8:线程池的队列一般设置多少

9:线程池的实现,源码中常用的方法

10:线程池和线程的区别,线程池有哪些,什么情况下使用,业务场景

11:线程的状态,线程池的构造方式,常见线程池

VSS shielding线可以floating吗? shielding vss不打孔,就相当于dummy metal,如果周围有其他干扰线,他们影响了这段dummy metal,这段dummy metal仍然会对目标线产生干扰,bug的是,工具知道这段dummy是vss,那么计算寄生的时候仍然把它当vss,就有可能噪声没有完全消除,而用户又看不见。而真正接地的线,相当于一直是0,就不会对目标线产生干扰,一般加shield是在route之前,这时候shield能尽量覆盖目标线,等到绕线后再加就会出现shield只覆盖到一部分目标线的情况。 阅读详情

相关推荐

Unity卡牌游戏UI框架:数据驱动与模块化设计实践

在Unity游戏开发中,UI系统是连接玩家与游戏逻辑的关键桥梁,其核心在于实现数据与表现的高效同步。数据驱动设计通过分离数据模型、逻辑状态与视图表现,利用观察者模式自动响应状态变化,确保了代码的清晰与可维护性。这种架构显著提升了开发效率,尤其在需要复杂状态管理和实时反馈的交互场景中,如卡牌游戏的拖拽、布局与动画系统。基于模块化思想,开发者可以将卡牌视图、布局管理、区域控制等组件像积木一样组合,快速构建出动态的手牌弧形布局、战场区域管理等特色功能。通过集成对象池、图集优化等性能方案,还能有效管理绘制调用与网格

weixin_34262482的博客 451

ThreadPoolExecutor参数设置

1-首先预估系统负载,需要以下几个值: tasks :每秒的任务数,假设为50~100 taskTime:每个任务花费时间,假设为0.1s responseTime:系统允许容忍的最大响应时间,假设为30s 2-计算 1)corePoolSize 每个任务需要taskTime秒处理,则每个线程每秒可处理1/taskTime个任务。系统每秒有tasks个任务需要处理,则需要的线程数为: threadcount = tasks/(1/taskTime) = tasks*taskTime = (10~20)*0.

thunder-1 1834

Js逆向抖音a_bogus --/* V 1.0.1.19-fix.01 */补环境

需要在addEventListener中补一个鼠标移动事件,不补这个环境,生成的值是假值,你拿去请求,响应200,但是没有数据,这个算是dy的最难发现的一个难点。dy这个,没有原形链检测,我只是习惯了这样补,对XMLHttpRequest进行重写,导出a_bogus.发现可以响应状态码200,而且可以获取数据,接着注释params中的a_bogus。在n.apply的下面插入上述代码,对a_bogus进行全局导出。如果没有,就多放几次断点,因为每个人的游览器不一样。必须触发至少一次鼠标事件,不触发不给过。

2302_76420666的博客 4201

【线程池】Java线程池的核心参数

一篇文章带你快速了解Java线程池的核心参数

小七的博客 7710

CAD二次开发(C#版):从零搭建开发环境与核心DLL引用指南

本文详细介绍了使用C#进行CAD二次开发的环境搭建与核心DLL引用指南,涵盖Visual Studio配置、AutoCAD插件项目创建、DLL引用技巧及调试方法。通过实战示例和常见问题排查,帮助开发者快速掌握CAD二次开发的核心技术,提升开发效率。

weixin_28837817的博客 727

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制(上)在线激情讲解transformer&Attention注意力机制(上)_哔哩哔哩_bilibiliAttention is all you need介绍 更具体的介绍可以去阅读论文在Attention is all you need这篇文章中提出了著名的Transformer模型Transforme

Peter的博客 1万+

ThreadPoolTaskExecutor 中 corePoolSize vs. maxPoolSize

1. 概览 Spring中的 ThreadPoolTaskExecutor 是一个 JavaBean ,提供围绕java.util.concurrent.ThreadPoolExecutor 的抽象实例,并作为Spring 中org.springframework.core.task.TaskExecutor 暴露出来. 此外,它可以通过corePoolSize、maxPoolSize、queue...

liululee的博客 4786

第154章 点云大规模并行处理(GPU加速)

优化点云处理✨ 使用。

yumeiguo的博客 374

ThreadPoolTaskExecutor自定义线程大小及队列设量标准

ThreadPoolTaskExecutor自定义线程大小及队列设量标准

qq_40549814的博客 6298

康复训练监测系统:基于YOLOv8的患者动作规范识别

本文系统介绍了基于YOLOv8的康复训练动作规范识别系统,从理论背景、数据准备、模型训练、推理应用到UI界面,提供了完整技术链条及代码示范。希望对康复领域的智能监测应用提供参考和借鉴。

YOLO 453

手把手教你学Simulink——基于电机驱动系统的场景实例:永磁同步电机(PMSM)在电动汽车中的矢量控制仿真

随着全球对环境保护的关注增加,电动汽车(Electric Vehicle, EV)因其环保特性而受到广泛关注。永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)由于其高效率、高功率密度和良好的动态响应性能,在电动汽车驱动系统中得到了广泛应用。矢量控制(Field-Oriented Control, FOC)是实现PMSM高性能控制的关键技术之一,它能够实现对电机转矩和磁场的独立控制,从而达到类似直流电机的控制效果。本文将详细介绍如何使用来构建一个。

MHD0815的博客 1万+

ThreadPoolExecutor 理解

ThreadPoolExecutor将根据corePoolSize 和 maximumPoolSize 设置的边界自动调整线程池大小,在方法execute(Runnable)中提交新任务时,如果运行的线程数少于corePoolSize, 即使其他工作线程处于空闲状态,也会创建一个新线程来处理请求。取最高位的值是:从右边数第9位是:256 减去间隔的值右边数6位和7位,他们的值是 64+32=96。当执行因达到线程边界 和 队列容量时 使用的策略,如果任务阻塞队列已满且线程池中的线程数等于。

xiweihao的博客 1365

三相五柱式消弧线圈自动测控装置设计与实现

本文设计了一种基于STM32的三相五柱式消弧线圈自动测控装置。该装置采用信号注入法检测系统对地电容电流,通过PID自适应算法调节消弧线圈电感值,实现单相接地故障时的快速补偿。硬件系统包含信号采集、注入、控制执行等模块,软件采用Goertzel算法提取特征频率信号,结合增量式PID实现精确控制。实验结果表明,装置电容检测误差小于2%,调谐响应时间小于50ms,满足配电网对消弧线圈自动调谐的技术要求。

AI的内部世界的博客 237

线程池面试分析

一. 线程池的作用? 降低创建线程和销毁线程的性能开销 提高响应速度,当有新任务需要执行是不需要等待线程创建就可以立马执行 合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题 二.有界和无界队列? 有界队列:就是有固定大小的队列。比如设定了固定大小的ArrayBlockingQueue,LinkedBlockingQueue,又或者大小为 0...

zz_ddup的博客 874

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JUC线程池-ThreadPoolExecutor

在探讨的细节之前,我们首先要理解为什么在Java并发编程中,线程池扮演着如此重要的角色。

左灯右行的爱情 1281

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JUC多线程:线程池的创建及工作原理 和 Executor 框架

一、什么是线程池: 线程池主要是为了解决 新任务执行时,应用程序为任务创建一个新线程 以及 任务执行完毕时,销毁线程所带来的开销。通过线程池,可以在项目初始化时就创建一个线程集合,然后在需要执行新任务时重用这些线程而不是每次都新建一个线程,一旦任务已经完成了,线程回到线程池中并等待下一次分配任务。 二、创建线程池: 1、通过Executors创建线程池: 在JUC包中的Executors中,提供了一些静态方法,用于快速创建线程池,常见的线程池有: (1)newSingleThreadExecutor:创建一

张维鹏的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【JUC基础】12. 线程池(一)

我们知道多线程的使用,是为了最大限度发挥现代多核处理器的计算能力,提高系统的吞吐量和性能。但是如果不加以控制和管理,随意使用多线程,对系统性能反而会有不利的影响。线程数量和系统CPU资源是息息相关的,随意使用甚至可能会耗尽系统CPU资源和内存资源。

有一只柴犬的专栏 1618

线程池ThreadPoolExecutor源码深度解析

*** 带监控统计的拒绝策略处理器*/// 统计被拒绝的任务数量@Override// 1. 采集线程池关键指标// 2. 递增拒绝计数器// 3. 输出警告日志(包含完整指标)任务被拒绝执行!线程池状态:|- 活跃线程数/当前线程数: {}/{}|- 核心/最大线程数: {}/{}|- 队列大小: {}|- 已完成任务数: {}|- 历史拒绝总数: {}|- 被拒绝任务: {}""",queueSize,

jike007gt的博客 1017

JUC Executor-ThreadPoolExecutor(线程池) 源码解析

通过Java并发编程实战(进阶篇 - 下)对 Executor 框架的简介,已经基本了解了 Executor 框架的结构和成员,本篇讲解 Executor 框架中任务执行单元 ThreadPoolExecutor(线程池)工作原理。 前言 提出三个问题来更好的了解 ThreadPoolExecutor: 什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行...

淦淦淦! 559

java之juc之线程池

dubbo直接继承的 AbortPolicy输出了一条警告级别的日志,日志内容为线程池的详细设置参数,以及线程池当前的状态,还有当前拒绝任务的一些详细信息。可以说,这条日志,使用dubbo的有过生产运维经验的或多或少是见过的,这个日志简直就是日志打印的典范,其他的日志打印的典范还有spring。得益于这么详细的日志,可以很容易定位到问题所在输出当前线程堆栈详情,这个太有用了,当你通过上面的日志信息还不能定位问题时,案发现场的dump线程上下文信息就是你发现问题的救命稻草,这个可以参考。

梦想是很难很难的,所以先勇敢一点 1238

线程池ThreadPoolExecutor源码分析(上)

线程池是一种基于资源复用思想的池化技术。由线程池统一地去创建,回收线程,避免频繁地手动创建,销毁线程,以减少开销。阿里开发手册强制规范10,200,30,i < 10;i++) {});注意:本篇中提到的线程池,是JUC包下的线程池,非Tomcat的实现,Tomcat的线程池做过二次开发,和JUC的实现细节有所区别。

西岭千秋雪的博客 1114

深入线程池ThreadPoolExecutor

我们先从阿里编程手册里面关于并发编程的两点来说明。 6.3:线程资源必须通过线程池创建,不允许在应用中自行显示创建线程。 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源的不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者"过度切换"的问题。 6.4:线程池不允许使用Executors创建,而是通过ThreadPool...

懂幸福,爱生活 725

Java线程池ThreadPoolExecutor

Java线程池ThreadPoolExecutor 背景 本文基于JDK1.7的源码进行分析并解读。 ThreadPoolExecutor是Doug Lea大神开发的JUC提供的一类线程池工具,也是Java语言中应用场景最多的并发框架,可以说,几乎所有需要异步或者并发执行的,都可以使用Java线程池。 优点 合理的使用线程池能够带来的好处: 1.降低资源消耗:通过复用已经创建好的线程来降低线程创建...

复利人生的博客 628

JUC并发编程(十一)-线程池ThreadPoolExecutor详解

11、线程池 线程池重点内容:三大方法、7大参数、拒绝策略、优化配置。 11.1. 线程池原理 池化技术 ​ 程序运行的本质:占用系统资源,CPU/磁盘网络进行使用!我们希望可以高效的使用!池化技术就是演进出来的。 ​ 简单的说,池化技术就是:提前准备一些资源、以供使用! ​ 线程池、连接池、内存池、对象池…这些东西都是池化技术。 ​ 线程的创建和销毁,...

二总的猫 658

线程池ThreadPoolExecutor详解

ThreadPoolExecutor 是 Java 并发编程中的重要工具,用于管理一组线程以执行任务。它通过复用线程来减少创建和销毁线程的开销,从而提升性能和资源利用率。以下是其主要特性和使用方式的简要说明。ThreadPoolExecutor 是 Java 并发编程中不可或缺的工具,它通过管理线程池来优化任务执行效率。理解其核心参数、任务执行机制以及关闭方式,能够帮助开发者正确使用线程池,避免常见问题如内存溢出或资源耗尽。

likuoelie的博客 943

JUC夯实之路-线程池

线程池是 JDK 提供的一种线程复用机制,用于统一管理多个线程的创建、销毁和调度,可以显著提高多线程程序的性能和可控性。线程池 = 一组可复用的线程 + 队列 + 策略控制器线程池是高并发编程的性能利器,合理配置核心线程数、队列容量和拒绝策略,可以显著提升系统的稳定性和吞吐量。

2302_78534728的博客 683
上一篇: 【JavaScript】JavaScript 全局,了解一下?
下一篇: 【Centos】CentOS7.4 同步时间
tanpenggood
博客等级 码龄9年 129粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值