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

系统常用线程池配置,使用与注意事项

常用线程池配置,使用与注意事项

  • 1. 线程池构建
  • 2. 线程池使用
    • 2.1 注意事项

1. 线程池构建

public class ThreadPoolBuilder {private static final Logger logger = org.slf4j.LoggerFactory.getLogger(ThreadPoolBuilder.class);/*** CPU核数*/private static int CPU_CORES ;static {try {// 获取分配给当前实例的CPU核心数CPU_CORES = Runtime.getRuntime().availableProcessors();} catch (Throwable e) {logger.error("获取CPU核心数失败", e);// 异常情况下设置一个默认安全值CPU_CORES = 8;}logger.info("CPU核数:{}", CPU_CORES);}/*** 核心线程数,默认CPU核数的2倍*/public static final int CORE_POOL_SIZE = CPU_CORES * 2;/*** 最大线程数,默认CPU核数的4倍*/public static final int MAXIMUM_POOL_SIZE = CPU_CORES * 4;/*** 线程空闲后的存活时间,默认30秒*/public static final long KEEP_ALIVE_TIME = 30000L;/*** 线程存活时间单位,默认毫秒*/public static final TimeUnit TIMEUNIT = TimeUnit.MILLISECONDS;/*** 线程队列,默认LinkedBlockingQueue,容量1000*/public static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingQueue<>(1000);/*** 默认拒绝策略*/public static final RejectedExecutionHandler DEFAULT_HANDLER = new ThreadPoolExecutor.CallerRunsPolicy();/*** 创建线程池** @param poolName      线程池名称* @param corePoolSize  核心线程数* @param maxPoolSize   最大线程数* @param keepAliveTime 线程空闲时间* @param unit          时间单位* @return 线程池实例*/public static ExecutorService createNamedThreadPool(String poolName,int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit) {return createNamedThreadPool(poolName, corePoolSize, maxPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>(1000));}/*** 创建线程池** @param poolName      线程池名称* @param corePoolSize  核心线程数* @param maxPoolSize   最大线程数* @param keepAliveTime 线程空闲时间* @param unit          时间单位* @param workQueue     工作队列* @return 线程池实例*/public static ExecutorService createNamedThreadPool(String poolName,int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {return createNamedThreadPool(poolName, corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, new ThreadPoolExecutor.CallerRunsPolicy());}/*** 创建线程池** @param name          线程池名称* @param corePoolSize  核心线程数* @param maxPoolSize   最大线程数* @param keepAliveTime 线程空闲时间* @param unit          时间单位* @param workQueue     工作队列* @param handler       拒绝策略* @return 线程池实例*/public static ExecutorService createNamedThreadPool(String poolName,int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) {if (corePoolSize < 0 || maxPoolSize <= 0 || keepAliveTime < 0) {throw new IllegalArgumentException("Invalid pool parameters");}if (workQueue == null) {throw new IllegalArgumentException("Work queue cannot be null");}return new ThreadPoolExecutor(corePoolSize,maxPoolSize,keepAliveTime,unit,workQueue,new DefaultThreadFactory(poolName),handler);}/*** 销毁线程池*/public static void shutdown(ExecutorService executorService) {if (executorService == null || executorService.isShutdown()) {return;}try {executorService.shutdown();} catch (Exception e) {logger.error("Failed to shutdown executor service gracefully: {}", e.getMessage(), e);}}/*** 销毁线程池*/public static void shutdownOrNow(ExecutorService executorService) {if (executorService == null || executorService.isShutdown()) {return;}try {executorService.shutdown();// 等待线程池中的任务在60秒内完成,若超时则强制终止所有正在执行的任务if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {executorService.shutdownNow();}} catch (InterruptedException e) {executorService.shutdownNow();logger.error("Failed to shutdown executor service gracefully: {}", e.getMessage(), e);}}}

2. 线程池使用

2.1 注意事项

一个系统不建议随意的的创建线程池,避免线程膨胀导致CPU开销过大,导致系统性能下降,甚至系统崩溃。
通用公共线程池, 核心线程池等需要常驻的线程池,不要关闭

/*** 线程池工厂类** @author Aron*/
public class ThreadPoolFactory {/*** 线程池名称*/public static String THREAD_POOL_NAME = " thread-pool-%s";public static String buildPoolName(String poolName) {return String.format(THREAD_POOL_NAME, poolName);}/*** 说明:一个系统不建议随意的的创建线程池,避免线程膨胀导致CPU开销过大,导致系统性能下降,甚至系统崩溃。* <p>* 通用公共线程池:需要常驻,不要关闭线程池** 可以执行一些耗时操作,或者时效性要求较低,或者一致性要求较低的任务,例如定时任务、重试任务、数据分析、邮件发送等*/public static ExecutorService COMMON_POOL;static {COMMON_POOL = ThreadPoolBuilder.createNamedThreadPool(buildPoolName("common"),CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TIMEUNIT, WORK_QUEUE, DEFAULT_HANDLER);}/*** 核心线程池:需要常驻,不要关闭线程池*/public static ExecutorService ACTUAL_POOL;static {ACTUAL_POOL= ThreadPoolBuilder.createNamedThreadPool(buildPoolName("actual"),5, 10, KEEP_ALIVE_TIME, TIMEUNIT);}/*** 支持自定义创建临时线程池** @param name          线程池名称* @param corePoolSize  核心线程数* @param maxPoolSize   最大线程数* @param keepAliveTime 线程空闲时间* @param unit          时间单位* @param workQueue     工作队列* @param handler       拒绝策略* @return 线程池实例*/public static ExecutorService createNamedThreadPool(String poolName,int corePoolSize,int maxPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) {return ThreadPoolBuilder.createNamedThreadPool(String.format(THREAD_POOL_NAME, poolName),corePoolSize,maxPoolSize,keepAliveTime,unit,workQueue,handler);}/*** 销毁线程池: 临时创建的线程池需要销毁*/public static void shutdown(ExecutorService executorService) {ThreadPoolBuilder.shutdown(executorService);}/*** 销毁线程池: 临时创建的线程池需要销毁*/public static void shutdownOrNow(ExecutorService executorService) {ThreadPoolBuilder.shutdownOrNow(executorService);}}

相关文章:

  • 【Android】EventBus详解
  • 【测试开发】面向对象-魔术方法
  • 企业架构框架深入解析:TOGAF、Zachman Framework、FEAF与Gartner EA Framework
  • python打卡day53@浙大疏锦行
  • HarmonyOS 组件复用面试宝典 [特殊字符]
  • 《AI日报 · 0613|ChatGPT支持导出、Manus免费开放、GCP全球宕机》
  • 每天宜搭宜搭小知识—报表组件—柱线混合图
  • 【实用生信代码】分子对接后的分子动力学模拟实战——OpennMM
  • PH热榜 | 2025-06-13
  • 包含11个整套APP移动端UI的psd适用于旅行聊天交友相关的社交应用程序
  • 篇章五 系统性能优化——资源优化——CPU优化(2)
  • 自定义View实现K歌开始前歌词上方圆点倒计时动画效果
  • Springboot短视频推荐系统b9wc1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 商务通用扁平风格主题PPT模版分享
  • docker部署DNS服务并带有图形界面管理——筑梦之路
  • 【深度解析】海外短剧系统开发全流程:从0到1搭建高并发、多语言短剧平台的技术架构与运营策略
  • 第8章——8天Python从入门到精通【itheima】-88~90-Python的文件操作(文件的写出+文件的追加+综合案例)
  • python数据挖掘编程题
  • Vulkan学习笔记6—渲染呈现
  • 《并查集》题集
  • 西安搜建站科技网站/建站seo是什么
  • 游戏代理商/南宁百度seo排名价格
  • 优秀甜品网站/怎么做公司网站推广
  • 苏州相城做网站的/最新足球消息
  • 资源最全的网盘搜索引擎/关键词优化的策略有哪些
  • 网站建设和销售有关吗/今日国际军事新闻