多线程是 Java 中非常重要的技术,合理使用线程池可以有效提升系统性能、控制资源消耗。下面整理了一个 通用线程池工具类,并逐行解释每个参数和使用方法
package org.berlin.shirotest.common.utils;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
/**
* 通用线程池工具类
*/
@Slf4j
public class ThreadPoolUtils {
// CPU 核心数
private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();
// 最大线程数
private static final int MAX_POOL_SIZE = CORE_POOL_SIZE * 2;
// 非核心线程存活时间(秒)
private static final int KEEP_ALIVE_SECONDS = 60;
// 队列容量
private static final int QUEUE_CAPACITY = 500;
// 创建线程池
private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_SECONDS,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(QUEUE_CAPACITY), // 阻塞队列
new ThreadFactory() { // 自定义线程工厂
private final ThreadFactory defaultFactory = Executors.defaultThreadFactory();
private int counter = 0;
@Override
public Thread newThread(Runnable r) {
Thread t = defaultFactory.newThread(r);
t.setName("custom-pool-thread-" + (++counter));
t.setDaemon(false); // 非守护线程
return t;
}
},
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
static {
// 定时打印线程池状态(可选)
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
log.info("ThreadPool ActiveCount={}, QueueSize={}, CompletedTaskCount={}",
executor.getActiveCount(),
executor.getQueue().size(),
executor.getCompletedTaskCount());
}, 0, 30, TimeUnit.SECONDS);
}
private ThreadPoolUtils() {
// 工具类不允许实例化
}
/** 提交 Runnable 任务 */
public static void execute(Runnable task) {
executor.execute(task);
}
/** 提交 Callable 任务,返回 Future */
public static <T> Future<T> submit(Callable<T> task) {
return executor.submit(task);
}
/** 提交 Runnable 任务,带返回 Future */
public static Future<?> submit(Runnable task) {
return executor.submit(task);
}
/** 获取线程池实例 */
public static ThreadPoolExecutor getExecutor() {
return executor;
}
/** 优雅关闭线程池 */
public static void shutdown() {
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
}参数 | 含义 | 说明 |
|---|---|---|
CORE_POOL_SIZE | 核心线程数 | 核心线程会一直保留,即使空闲 |
MAX_POOL_SIZE | 最大线程数 | 当任务量大于队列容量时,可以扩展到最大线程数 |
KEEP_ALIVE_SECONDS | 非核心线程存活时间 | 空闲线程超过该时间会被回收 |
QUEUE_CAPACITY | 阻塞队列容量 | 存放等待执行的任务 |
ThreadFactory | 线程工厂 | 可以自定义线程名、是否守护线程等 |
CallerRunsPolicy | 拒绝策略 | 当队列满了且线程数达到最大值,任务在调用线程执行 |
LinkedBlockingQueue | 阻塞队列 | 默认 FIFO,保证任务顺序执行 |
ThreadPoolUtils.execute(() -> {
System.out.println("Hello from thread: " + Thread.currentThread().getName());
});Future<Integer> future = ThreadPoolUtils.submit(() -> {
Thread.sleep(1000);
return 42;
});
System.out.println("Result: " + future.get());ThreadPoolExecutor executor = ThreadPoolUtils.getExecutor();
System.out.println("Active threads: " + executor.getActiveCount());ThreadPoolUtils.shutdown();💡 小技巧
CallerRunsPolicy 是最安全的默认策略
本篇文章介绍了一个 Java 通用线程池工具类,适合管理异步任务、高并发场景和资源控制。
ThreadPoolExecutor
Runnable 和 Callable 任务
execute(Runnable)
submit(Callable<T>)
getExecutor()
shutdown()
CallerRunsPolicy 是安全默认