当前位置: 首页 > news >正文

Apache Commons ThreadUtils 的使用与优化

Apache Commons ThreadUtils 的使用与优化

1. 问题背景

在 Java 系统中,跨系统接口调用通常需要高并发支持,尤其是线程池的合理配置至关重要。如果线程池使用不当,可能导致性能下降,线程等待或过载。

当前问题

  • 使用了 Apache Commons ThreadUtils 线程工具类。
  • 存在线程池配置不合理的问题,例如核心线程数过低、最大线程数限制不足。
  • 跨系统接口调用时,响应时间增长了 35%,导致整体系统性能下降。

2. Apache Commons ThreadUtils 简介

ThreadUtils 是 Apache Commons 提供的工具类,主要用于线程操作管理和线程池配置。它的功能包括:

  • 查询活动线程和线程组。
  • 提供线程池管理工具类,结合 Executors
  • 简化对线程的监控和操作。

常用方法

  1. 获取活动线程组

    ThreadGroup mainGroup = ThreadUtils.getSystemThreadGroup();
    System.out.println("活动线程组: " + mainGroup.getName());
    
  2. 获取线程池
    可以创建和管理线程池:

    ExecutorService executorService = ThreadUtils.newFixedThreadPool(10);
    
  3. 监控线程状态

    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 系统中&#xff0c;跨系统接口调用通常需要高并发支持&#xff0c;尤其是线程池的合理配置至关重要。如果线程池使用不当&#xff0c;可能导致性能下降&#xff0c;线程等待或过载。 当前问题 使用了 Apache …...

重温设计模式--5、职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&am…...

下午四点半

客户的员工竟然背着公司开发报表系统&#xff0c;是在密谋什么大事吗&#xff1f; 之前去线下给客户的员工培训&#xff0c;当时我就对这个小姑娘印象很深刻&#xff0c;因为她后面加了我们的技术人员&#xff0c;问了很多问题&#xff0c;不同于从来没有用过低代码平台的人&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文件&#xff0c;写入以下代码&#xff1a; let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...

利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展

经过多轮迭代&#xff0c;deepin 文件管理器&#xff08;dde-file-manager&#xff09;的扩展功能已经趋于稳定&#xff0c;看到越来越丰富的文管新功能&#xff0c;作为一名技术爱好者&#xff0c;也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...

JPA 基本查询(五)

JPA 查询Exists示例 JPA教程 - JPA 查询Exists示例 如果子查询返回任何行&#xff0c;则EXISTS条件返回true。 以下代码显示如何在JPQL中使用带有子查询的EXISTS运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE EXISTS " "(SELECT p FROM …...

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址&#xff1a;electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm&#xff08;socket.…...

项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战

项目报 OutOfMemoryError、GC overhead limit exceeded 问题排查以及解决思路实战 前言&#xff1a; 问题现象描述&#xff1a; 1&#xff0c;生产环境有个定时任务&#xff0c;没有初始化告警数据【告警数据量为1000多个】 2&#xff0c;其他定时任务执行正常 3&#xff0c;查…...

【计算机-显示屏灰阶测试】

硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶&#xff08;色带&#xff09;■ 对比率■■ ■ 对比度 在一个性能良好的显示器上&#xff0c;您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...

CSS系列(40)-- Container Queries详解

前端技术探索系列&#xff1a;CSS Container Queries详解 &#x1f4e6; 致读者&#xff1a;探索组件响应式的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Container Queries&#xff0c;这个强大的组件级响应式特性。 基础概念 &#x1f680; 容…...

工作生活做事慢效率低原因及解决方案

时间和效率管理具体版&#xff08;初阶&#xff09;&#xff08;一&#xff09; 工作&生活做事慢效率低原因及解决方案 一、效率慢的原因&#xff08;动物解析法&#xff08;编者自创&#xff09;&#xff09; 打败你的可能是生活的小事 1.无头苍蝇无流程 做事之前没有想…...

各种数据库类型介绍

在软件开发和数据处理领域&#xff0c;数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据&#xff0c;是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍&#xff1a; 1.关系型数据库&#xff08;Relational Databases&#xff09; 关系型数据库…...

了解智能运维

智能运维 &#xff08;一&#xff09;运维工作的转变 随着技术发展&#xff0c;运维工作从基础的搬机器、插网线、装系统等体力活儿&#xff0c;逐渐转变为更侧重服务器管理、代码管理、日志分析、监控告警、流量管理及故障排查等的脑力劳动。如今&#xff0c;运维人员拿到的…...

js实现仿windows文件名称排序

引言&#xff1a; 在JavaScript中&#xff0c;数组排序是一个常见的操作&#xff0c;但默认的Array.sort()方法只能进行简单的字符串比较。在处理复杂数据时&#xff0c;我们需要自定义排序函数来满足特定的需求。本文将通过一个具体的代码示例&#xff0c;解释如何实现一个仿w…...

基于Oauth2的SSO单点登录---前端

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架&#xff0c;提供了丰富的组件和功能&#xff0c;可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 &#xff08;一&#xff09;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&#xff0c;实现地图符号的设计/存储与显示&#xff1b;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号&#xff0c;改变矢量图层的显示效果&#xff1b;可编辑地图的符号库汇中的点符号、线符号、面符号…...

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...