Java 线程池详解
Java 线程池详解
一、基本概念与核心参数
✅ 核心参数:
参数名 作用 示例值
corePoolSize 核心线程数,即使空闲也不会被回收的线程数量 5
maximumPoolSize 最大线程数,当队列满时允许创建的非核心线程数 10
keepAliveTime 非核心线程空闲时的存活时间 3(秒)
workQueue 任务队列,用于缓存待执行任务 ArrayBlockingQueue
handler 拒绝策略,当队列和线程池满时的处理逻辑 AbortPolicy
二、工作流程
提交任务:通过 execute() 或 submit() 提交任务。
核心线程分配:
若当前线程数 < 核心线程数,直接创建新线程执行任务。
若核心线程已满,任务进入队列等待。
非核心线程启用:
队列满且线程数 < 最大线程数时,创建临时线程处理任务。
拒绝策略触发:
队列和线程池均满时,执行拒绝策略(如抛出异常或丢弃任务)。
三、常见线程池类型
类型 特点 适用场景
FixedThreadPool 固定核心线程数 + 无界队列(可能导致内存溢出) 长期稳定并发任务
CachedThreadPool 无核心线程,最大线程数极大(Integer.MAX_VALUE) 短期高并发任务
SingleThreadExecutor 仅 1 个核心线程,保证任务顺序执行 串行化任务(如日志处理)
ScheduledThreadPool 支持定时/周期性任务(如心跳检测) 定时任务调度
四、Spring 集成线程池
-
配置示例(XML)
xml
Copy Code
-
使用注解
java
Copy Code
@Async("taskExecutor")
public void asyncTask() {
// 异步任务逻辑
}
五、最佳实践
避免无界队列:使用 ArrayBlockingQueue(有界队列)防止内存溢出。
自定义拒绝策略:
CallerRunsPolicy:由提交任务的线程直接执行任务。
DiscardOldestPolicy:丢弃队列中最旧任务并重试提交新任务。
监控工具:
getActiveCount():获取活跃线程数。
getQueue().size():查看队列积压任务数量。

浙公网安备 33010602011771号