Apache Commons ThreadUtils 的使用与优化
Apache Commons ThreadUtils 的使用与优化
1. 问题背景
在 Java 系统中,跨系统接口调用通常需要高并发支持,尤其是线程池的合理配置至关重要。如果线程池使用不当,可能导致性能下降,线程等待或过载。
当前问题
- 使用了 Apache Commons ThreadUtils 线程工具类。
- 存在线程池配置不合理的问题,例如核心线程数过低、最大线程数限制不足。
- 跨系统接口调用时,响应时间增长了 35%,导致整体系统性能下降。
2. Apache Commons ThreadUtils 简介
ThreadUtils 是 Apache Commons 提供的工具类,主要用于线程操作管理和线程池配置。它的功能包括:
- 查询活动线程和线程组。
- 提供线程池管理工具类,结合
Executors。 - 简化对线程的监控和操作。
常用方法
-
获取活动线程组
ThreadGroup mainGroup = ThreadUtils.getSystemThreadGroup(); System.out.println("活动线程组: " + mainGroup.getName()); -
获取线程池
可以创建和管理线程池:ExecutorService executorService = ThreadUtils.newFixedThreadPool(10); -
监控线程状态
Collection<Thread> threads = ThreadUtils.findThreadsByName("worker-thread", true); threads.forEach(thread -> System.out.println(thread.getState()));
3. 优化跨系统接口调用的建议
3.1 合理配置线程池
当前问题
- 使用
ThreadUtils.newFixedThreadPool时,固定线程数过低。 - 默认线程空闲时可能被回收,导致频繁创建新线程。
优化方案
-
动态线程池:根据接口调用量动态调整线程池的核心线程数和最大线程数。
ExecutorService dynamicThreadPool = new ThreadPoolExecutor(10, // 核心线程数50, // 最大线程数60L, // 空闲线程存活时间TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000) // 阻塞队列容量 ); -
拒绝策略:配置
ThreadPoolExecutor.CallerRunsPolicy,避免任务直接丢弃。((ThreadPoolExecutor) dynamicThreadPool).setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
3.2 增加连接池支持
对于跨系统接口调用的性能优化,线程池之外需要优化连接池:
- 问题:默认的最小连接数为 0,闲置连接会自动关闭。
- 解决方案:
- 使用 Apache HttpClient 或 HikariCP 配置最小连接数,保持最小活动连接池大小。
- 示例:优化 Apache HttpClient 的连接池
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(100); // 最大连接数 cm.setDefaultMaxPerRoute(20); // 每个路由的最大连接数
3.3 增强监控与日志
-
线程池监控:通过 ThreadUtils 提供的工具方法,定期打印线程池状态。
ScheduledExecutorService monitorService = Executors.newScheduledThreadPool(1); monitorService.scheduleAtFixedRate(() -> {ThreadPoolExecutor executor = (ThreadPoolExecutor) dynamicThreadPool;System.out.println("Active Threads: " + executor.getActiveCount());System.out.println("Completed Tasks: " + executor.getCompletedTaskCount());System.out.println("Queue Size: " + executor.getQueue().size()); }, 0, 5, TimeUnit.SECONDS); -
日志工具集成:结合 SLF4J 或类似工具记录关键线程和接口调用情况。
4. 优化后的线程池工具封装
将优化后的线程池和连接池封装为工具类,便于统一使用:
public class ThreadPoolUtil {private static final ThreadPoolExecutor executor;static {executor = new ThreadPoolExecutor(10,50,60L,TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy());}public static ExecutorService getExecutorService() {return executor;}public static void logThreadPoolStats() {System.out.println("Active Threads: " + executor.getActiveCount());System.out.println("Completed Tasks: " + executor.getCompletedTaskCount());System.out.println("Queue Size: " + executor.getQueue().size());}
}
5. 总结
- 原因分析:线程池配置不足导致线程争抢,连接池配置不合理增加了等待时间。
- 解决方案:
- 使用动态线程池,设置合理的核心线程数、最大线程数、拒绝策略。
- 增加连接池的最小活动连接数,优化闲置连接策略。
- 定期监控线程池和连接池状态,及时调整。
通过以上方式,可以有效减少跨系统接口调用的性能下降问题,并提升整体系统的并发能力和稳定性。
相关文章:
Apache Commons ThreadUtils 的使用与优化
Apache Commons ThreadUtils 的使用与优化 1. 问题背景 在 Java 系统中,跨系统接口调用通常需要高并发支持,尤其是线程池的合理配置至关重要。如果线程池使用不当,可能导致性能下降,线程等待或过载。 当前问题 使用了 Apache …...
重温设计模式--5、职责链模式
文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它旨在将请求的发送者和多个接收者解耦,让多个对象都有机会处理请求&am…...
下午四点半
客户的员工竟然背着公司开发报表系统,是在密谋什么大事吗? 之前去线下给客户的员工培训,当时我就对这个小姑娘印象很深刻,因为她后面加了我们的技术人员,问了很多问题,不同于从来没有用过低代码平台的人&a…...
嵌入式单片机中Flash存储器控制与实现
第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…...
loki failed to flush
loki 报错 levelerror ts2024-12-27T08:13:10.450140686Z callerflush.go:143 org_idfake msg"failed to flush" err"failed to flush chunks: store put chunk: open /data/loki/chunks/ZmFrZS85ODBmM2U3NzliODg2MjY1OjE5M2VhNDVkYTc4OjE5M2VhNDVlNDdkOjVmMjA…...
微信小程序打印生产环境日志
微信小程序打印生产环境日志 新建一个log.js文件,写入以下代码: let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...
利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展
经过多轮迭代,deepin 文件管理器(dde-file-manager)的扩展功能已经趋于稳定,看到越来越丰富的文管新功能,作为一名技术爱好者,也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...
JPA 基本查询(五)
JPA 查询Exists示例 JPA教程 - JPA 查询Exists示例 如果子查询返回任何行,则EXISTS条件返回true。 以下代码显示如何在JPQL中使用带有子查询的EXISTS运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE EXISTS " "(SELECT p FROM …...
hiprint结合vue2项目实现静默打印详细使用步骤
代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…...
项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战
项目报 OutOfMemoryError、GC overhead limit exceeded 问题排查以及解决思路实战 前言: 问题现象描述: 1,生产环境有个定时任务,没有初始化告警数据【告警数据量为1000多个】 2,其他定时任务执行正常 3,查…...
【计算机-显示屏灰阶测试】
硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶(色带)■ 对比率■■ ■ 对比度 在一个性能良好的显示器上,您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...
CSS系列(40)-- Container Queries详解
前端技术探索系列:CSS Container Queries详解 📦 致读者:探索组件响应式的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Container Queries,这个强大的组件级响应式特性。 基础概念 🚀 容…...
工作生活做事慢效率低原因及解决方案
时间和效率管理具体版(初阶)(一) 工作&生活做事慢效率低原因及解决方案 一、效率慢的原因(动物解析法(编者自创)) 打败你的可能是生活的小事 1.无头苍蝇无流程 做事之前没有想…...
各种数据库类型介绍
在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...
了解智能运维
智能运维 (一)运维工作的转变 随着技术发展,运维工作从基础的搬机器、插网线、装系统等体力活儿,逐渐转变为更侧重服务器管理、代码管理、日志分析、监控告警、流量管理及故障排查等的脑力劳动。如今,运维人员拿到的…...
js实现仿windows文件名称排序
引言: 在JavaScript中,数组排序是一个常见的操作,但默认的Array.sort()方法只能进行简单的字符串比较。在处理复杂数据时,我们需要自定义排序函数来满足特定的需求。本文将通过一个具体的代码示例,解释如何实现一个仿w…...
基于Oauth2的SSO单点登录---前端
Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架,提供了丰富的组件和功能,可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 (一)Vue-element-admin 的主要文件和目录 vue-element-admin/ |--…...
springboot 使用注解设置缓存时效
springboot 使用注解设置缓存时效 import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.cache.RedisCache; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCach…...
QGIS二次开发(地图符号库操作)
实习三 地图符号库操作 3.1 任务要求 基于QGIS,实现地图符号的设计/存储与显示;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号,改变矢量图层的显示效果;可编辑地图的符号库汇中的点符号、线符号、面符号…...
线性代数行列式
目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得:分…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
