spring中使用ThreadPoolTaskExecutor配置线程池

2023-11-16

背景

spring中经常使用ThreadPoolTaskExecutor来调用JDK的ThreadPoolExecutor初始化线程池, 尤其在有异步执行的任务时, 由于spring 异步任务默认使用的executor不会reuse线程, 因此需要设置默认线程池, 来替换spring 默认的SimpleAsyncTaskExecutor

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLLSstjB-1668741434112)(https://secure2.wostatic.cn/static/64FvJBaYKqNgPfUawt1QYE/image.png?auth_key=1668737566-csH8L4r5WcijBnru5MMQFB-0-de7138e88c12eeda47e1e385ffb4bdd7)]

参数

ThreadPoolTaskExecutor 不同的参数设置会使executor采用不同的策略

  • CorePoolSize 核心线程数

    默认值为1, 默认不会空闲销毁的线程, 可以设置AllowCoreThreadTimeOut=true(默认为false)控制核心线程空闲回收

  • MaxPoolSize 最大线程数

    线程池能容纳的最大线程数

  • QueueCapacity 线程池队列容量

    只有当队列容量满了, 才会创建新的线程执行任务, 否则放在队列中等待, 并且等待核心线程处理任务

  • RejectedExecutionHandler 当线程池达到max size时, 执行的策略

    如果线程池满了, 再进来新的任务, 将会执行rejected策略

改变上述参数值, 线程池分别表现为以下策略:

if 「线程池中线程的数量」<「corePoolSize 」:

创建新的线程来处理任务, 即便线程池中其他线程都是空闲状态

else if 「线程池中线程的数量」==「corePoolSize 」

&& 「QueueCapacity」未满 :

任务将被放入队列中等待线程执行

else if 「线程池中线程的数量」>「corePoolSize 」

&& 「QueueCapacity」已满

&& 「线程池中线程的数量」<「MaxPoolSize」:

创建新的线程来处理任务

else if 「线程池中线程的数量」<「corePoolSize 」

&& 「QueueCapacity」已满

&& 「线程池中线程的数量」==「MaxPoolSize」:

通过制定rejectedHandler处理

综上, 线程池执行的顺序即:

  • 核心线程corePoolSize?
  • 任务队列workQueue?
  • 最大线程 maximumPoolSize?
  • 如果三者都满了,使用handler处理被拒绝的任务

另外 如果线程池中的线程数 > 「corePoolSize」, 并且超过了『keepAliveTime(默认为60s)』, 线程将被回收, 以此来达到动态管理线程池的线程数

如何设置这些值

因为要考虑:

  • 运行机器的硬件参数
  • 期望的CPU占用率
  • 不同应用程序类型(IO密集型/CPU密集型)
  • 业务场景是否特别要求性能

种种情况, 组合的case就非常多了, 推荐的设置值是:

  • corePoolSize = CPU线程数/2

    Runtime.getRuntime().availableProcessors()//获取逻辑核心数,如6核心12线程,那么返回的是12

  • maxPoolSize = CPU 线程数

  • queueCapacity = ( corePoolSize / 任务处理时间 ) * 期望等待时间(秒)

  • rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy() 如果线程池满了, 丢给caller线程执行

有兴趣参考:

https://juejin.cn/post/6948034657321484318

写在最后

但是软件工程实践没有银弹 , 一切都要结合实际场景去考虑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring中使用ThreadPoolTaskExecutor配置线程池 的相关文章

  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 如何在 Spring 属性中进行算术运算?

  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • JUC 十. synchronized深入

    目录 一 基础复习 二 根据synchronized修饰不同成员了解synchronized实现原理 同步代码块 小总结 同步方法 小总结 synchronized 与 管程 底层分析 三 锁升级相关 复习一下对象头 无锁演示 偏向锁 演示
  • Spark、Strom、Flink和Beam的技术选型

    Spark streaming Storm Flink和Beam都是开源的分布式系统 具有低延迟 可扩展和容错性诸多优点 允许你在运行数据流代码时 将任务分配到一系列具有容错能力的计算机上并行运行 都提供了简单的API来简化底层实现的复杂程
  • c#中日志NLog配置问题

    Failed obtaining configuration for Common Logging from configuration section common logging 在配置中没有配置对 另外很有可能是NLog 的配置文件没
  • MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件

    MM32F3273G8P火龙果开发板MindSDK开发教程15 获取msa311加速器的方向改变事件 1 功能描述 类似手机里横屏竖屏检测 当方向发生变化时 横屏竖屏自动切换 当msa311方向改变时 会产生中断 然后从寄存器Reg 0x0
  • 性能测试 —— Tomcat监控与调优:Jconsole监控

    JConsole的图形用户界面是一个符合Java管理扩展 JMX 规范的监测工具 JConsole使用Java虚拟机 Java VM 提供在Java平台上运行的应用程序的性能和资源消耗的信息 在Java平台 标准版 Java SE平台 6
  • 【转载】wireshark抓包教程详解

    Wireshark软件安装 软件下载路径 wireshark官网 按照系统版本选择下载 下载完成后 按照软件提示一路Next安装 说明 如果你是Win10系统 安装完成后 选择抓包但是不显示网卡 下载win10pcap兼容性安装包 下载路径
  • 存储的一些基本概念(HBA,LUN)

    time 2008 11 12auther skate 最近存储要升级 对存储的认识也更进一步了 下面是关于存储的一些相关的概念 存储的一些基本概念 HBA LUN 有些新手总是在各式各样的概念里绕来绕去 弄的不亦乐乎 所以我就把我的一些理
  • jmeter断言

    1 设置断言 右击线程组 断言 响应断言 2 设置响应断言 测试的模式输入的内容来自 察看结果树中的响应结果 3 察看结果树执行结果 4 断言结果
  • 《深入浅出OCR》前言知识(一):机器学习最新全面总结

    专栏介绍 经过几个月的精心筹备 本作者推出全新系列 深入浅出OCR 专栏 对标最全OCR教程 具体章节如导图所示 将分别从OCR技术发展 方向 概念 算法 论文 数据集等各种角度展开详细介绍 面向对象 本篇前言知识主要介绍机器学习 方便小白
  • Windows10 - 在当前文件夹下打开cmd(命令行)的方法

    1 清除文件路径输入cmd 2 按住shift 再点击鼠标右键 在某个版本前 这里右键还是打开命令行 后来换成了打开ps 有改注册表的方法 将其改回打开cmd
  • vue3 使用vant框架的van-list 上拉加载用法

  • STM32PWM知识详解

    目录 一 PWM简介 1 定义 2 主要参数 二 PWM产生方式 1 普通IO口与PWM口 2 普通IO口产生PWM 3 PWM口产生PWM 总结 参考链接归纳 一 PWM简介 1 定义 脉冲宽度调制 PWM 是一种数字信号 最常用于控制电
  • 【C++入门】虚继承的实现原理

    转载自 http blog csdn net xiejingfa article details 48028491 准备工作 1 VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C 对象在内存中的
  • 计算两个数的平方和

    3 计算两个数的平方和 从键盘读入两个实数 编程计算并输出它们的平方和 要求使用数学函数pow x y 计算平方值 输出结果保留2位小数 程序中所有浮点数的数据类型均为float include
  • html右侧增加页面导航快捷键效果图及代码

    如果一个页面非常长时 在页面右侧增加导航快捷键还是比较有必要的 见效果图 局部放大后的效果 具体实现代码如下 html相关代码 div class gototop none div a href img src static imgs to
  • exit()函数

    进程的终止方式 有8种方式使进程终止 其中前5种为正常终止 它们是 1 从 main 返回 2 调用 exit 3 调用 exit 或 Exit 4 最后一个线程从其启动例程返回 5 最后一个线程调用pthread exit 异常终止有3种
  • Redis4.0从库复制报错"master_link_status:down"处理一例

    环境描述 Redis版本 4 0 2 主库 192 168 0 190 从库 192 168 0 191 今天Zabbix告警一直出现redis sync error的信息 于是登陆redis发现从库复制状态一直是master link s
  • 若依前端框架登录执行过程

    一 登录页面 登录页面是Views文件夹下的login vue文件 二 点击登录调用的方法为 handleLogin handleLogin this refs loginForm validate valid gt if valid th
  • Bugku题目MISC部分(持续更新)

    目录 telnet 1和0的故事 这是一张单纯的图片 隐写 社工 进阶收集 来自论坛提问 gQiRf的附件 zip 简单取证1 mimikatz PasswareKitForensic工具 眼见非实 啊哒 ping FileStoraged
  • spring中使用ThreadPoolTaskExecutor配置线程池

    背景 spring中经常使用ThreadPoolTaskExecutor来调用JDK的ThreadPoolExecutor初始化线程池 尤其在有异步执行的任务时 由于spring 异步任务默认使用的executor不会reuse线程 因此需