在 Java 中,Executor / ExecutorService 是并发编程的核心组件,合理配置执行器对系统性能、稳定性和资源占用非常重要。下面从常见类型、配置参数、示例代码、调优建议几个方面说明。
ExecutorService executor = Executors.newFixedThreadPool(10);
常见方法:
newFixedThreadPool(n):固定线程数newCachedThreadPool():线程可无限增长newSingleThreadExecutor():单线程newScheduledThreadPool(n):定时任务⚠️ 不推荐原因:
Integer.MAX_VALUE 队列newCachedThreadPool)public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
| 参数 | 说明 |
|---|---|
| corePoolSize | 核心线程数(常驻) |
| maximumPoolSize | 最大线程数 |
| keepAliveTime | 非核心线程空闲存活时间 |
| workQueue | 任务队列 |
| threadFactory | 线程工厂(命名、守护线程) |
| handler | 拒绝策略 |
ThreadPoolExecutor executor = new ThreadPoolExecutor(
10,
50,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadFactoryBuilder()
.setNameFormat("biz-pool-%d")
.build(),
new ThreadPoolExecutor.CallerRunsPolicy()
);
| 队列类型 | 特点 |
|---|---|
ArrayBlockingQueue |
有界,固定大小 |
LinkedBlockingQueue |
默认无界(要指定容量) |
SynchronousQueue |
不缓存任务,直接交给线程 |
PriorityBlockingQueue |
支持优先级 |
✅ 生产环境必须有界队列
| 策略 | 说明 |
|---|---|
| AbortPolicy | 抛异常(默认) |
| CallerRunsPolicy | 由调用线程执行 |
| DiscardPolicy | 直接丢弃 |
| DiscardOldestPolicy | 丢弃最老任务 |
示例:
new ThreadPoolExecutor.CallerRunsPolicy()
使用 Guava:
new ThreadFactoryBuilder()
.setNameFormat("order-task-%d")
.setDaemon(false)
.build();
或使用 JDK:
new ThreadFactory() {
private final AtomicInteger count = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "task-" + count.getAndIncrement());
}
}
@Configuration
public class ExecutorConfig {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(1000);
executor.setThreadNamePrefix("async-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
corePoolSize = CPU核数 + 1
corePoolSize = CPU核数 * 2 或更高
getActiveCount()getQueue().size()❌ 使用 Executors.newFixedThreadPool() 无界队列
❌ 核心线程数 = 最大线程数但队列无限
❌ 不设置线程名(排查问题困难)
❌ 忽略拒绝策略
如果你有 具体场景(Web / 定时任务 / 高并发接口) 或 使用的框架(Spring Boot / Netty),我可以给你更精准的配置方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。