系统常用线程池配置,使用与注意事项
常用线程池配置,使用与注意事项
- 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);}}