本文目录导读:

我为您详细介绍Java线程池的核心参数,并通过具体案例说明如何配置。
核心参数说明
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
workQueue, // 任务队列
threadFactory, // 线程工厂
handler // 拒绝策略
);
参数配置案例
案例1:CPU密集型任务
public class CPUIntensiveExample {
public static void main(String[] args) {
// 获取CPU核心数
int cpuCores = Runtime.getRuntime().availableProcessors();
// CPU密集型任务:核心线程数 = CPU核心数 + 1
ThreadPoolExecutor executor = new ThreadPoolExecutor(
cpuCores, // 核心线程数
cpuCores + 1, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100), // 有界队列
new ThreadFactory() {
private AtomicInteger count = new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName("CPU-Thread-" + count.incrementAndGet());
thread.setDaemon(false);
return thread;
}
},
new ThreadPoolExecutor.CallerRunsPolicy() // 调用者执行策略
);
// 提交CPU密集型任务
for (int i = 0; i < 100; i++) {
final int taskId = i;
executor.execute(() -> {
// 模拟CPU密集型计算
long sum = 0;
for (int j = 0; j < 1000000; j++) {
sum += j;
}
System.out.println("Task " + taskId + " completed, sum=" + sum);
});
}
executor.shutdown();
}
}
案例2:IO密集型任务
public class IOIntensiveExample {
public static void main(String[] args) {
// IO密集型任务:核心线程数 = CPU核心数 * 2
int cpuCores = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor executor = new ThreadPoolExecutor(
cpuCores * 2, // 核心线程数
cpuCores * 4, // 最大线程数
30L, // 空闲线程存活时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(500), // 有界链表队列
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略:抛出异常
);
// 提交IO密集型任务(模拟网络请求)
for (int i = 0; i < 200; i++) {
final int taskId = i;
executor.execute(() -> {
try {
// 模拟网络IO操作
Thread.sleep(1000);
System.out.println("IO Task " + taskId + " completed");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
executor.shutdown();
}
}
案例3:混合型任务(有界队列+自定义拒绝策略)
public class MixedTaskExample {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(50), // 有界队列,容量50
new NamedThreadFactory("Mixed"),
new CustomRejectedExecutionHandler() // 自定义拒绝策略
);
// 提交大量任务测试拒绝策略
for (int i = 0; i < 100; i++) {
final int taskId = i;
try {
executor.execute(() -> {
System.out.println("Processing task: " + taskId +
" by " + Thread.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
} catch (RejectedExecutionException e) {
System.err.println("Task " + taskId + " rejected");
}
}
executor.shutdown();
}
// 自定义线程工厂
static class NamedThreadFactory implements ThreadFactory {
private final String prefix;
private final AtomicInteger count = new AtomicInteger();
public NamedThreadFactory(String prefix) {
this.prefix = prefix;
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName(prefix + "-" + count.incrementAndGet());
return thread;
}
}
// 自定义拒绝策略
static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.err.println("Task rejected. Active: " + executor.getActiveCount() +
", Queue size: " + executor.getQueue().size());
// 记录日志或降级处理
// 可以在这里实现降级策略
}
}
}
案例4:动态配置线程池
public class DynamicThreadPoolConfigurator {
private volatile ThreadPoolExecutor executor;
private final int[] queueCapacity = {100, 200, 500, 1000};
public void reconfigure(int targetLoad) {
// 根据负载动态调整参数
int cpuCores = Runtime.getRuntime().availableProcessors();
// 根据负载调整核心线程数
int coreThreads;
if (targetLoad > 80) { // 高负载
coreThreads = cpuCores * 2;
} else if (targetLoad > 50) { // 中等负载
coreThreads = cpuCores + 1;
} else { // 低负载
coreThreads = cpuCores / 2;
}
executor.setCorePoolSize(coreThreads);
executor.setMaximumPoolSize(coreThreads * 2);
// 动态调整队列容量(如果使用ArrayBlockingQueue)
// 注意:实际项目中可能需要重新创建线程池来调整队列大小
System.out.println("Thread pool reconfigured: core=" + coreThreads +
", max=" + coreThreads * 2);
}
// 监控线程池状态
public void monitorPool() {
System.out.println("=== Thread Pool Status ===");
System.out.println("Active: " + executor.getActiveCount());
System.out.println("Core Pool Size: " + executor.getCorePoolSize());
System.out.println("Maximum Pool Size: " + executor.getMaximumPoolSize());
System.out.println("Queue Size: " + executor.getQueue().size());
System.out.println("Completed Tasks: " + executor.getCompletedTaskCount());
}
}
参数选择建议
核心线程数(corePoolSize)
- CPU密集型:
CPU核心数 + 1 - IO密集型:
CPU核心数 * 2或更多 - 混合型:根据CPU密集和IO密集的比例计算
最大线程数(maximumPoolSize)
- 通常是核心线程数的 1.5 ~ 3 倍
- 需要考虑系统资源限制
队列选择
// 有界队列 - 防止内存溢出 new ArrayBlockingQueue<>(100) // 无界队列 - 可能导致内存溢出 new LinkedBlockingQueue<>() // 同步队列 - 不缓存任务 new SynchronousQueue<>()
拒绝策略选择
| 策略 | 说明 | 适用场景 |
|---|---|---|
| AbortPolicy | 抛出异常 | 默认策略,适合重要任务 |
| CallerRunsPolicy | 调用者执行 | 适合降低吞吐量 |
| DiscardPolicy | 丢弃任务 | 适合不重要任务 |
| DiscardOldestPolicy | 丢弃最旧任务 | 适合实时性要求高的场景 |
最佳实践总结
public class ThreadPoolFactory {
public static ThreadPoolExecutor createPool(String type) {
int cpuCores = Runtime.getRuntime().availableProcessors();
switch (type) {
case "CPU":
return new ThreadPoolExecutor(
cpuCores, cpuCores + 1, 60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
case "IO":
return new ThreadPoolExecutor(
cpuCores * 2, cpuCores * 4, 30L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(500),
new ThreadPoolExecutor.AbortPolicy()
);
default:
return new ThreadPoolExecutor(
cpuCores, cpuCores * 2, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(200),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}
}
}
关键注意事项
- 谨慎使用
Executors工厂方法:很多预定义方法使用无界队列,可能导致OOM - 合理设置队列大小:根据任务量和响应时间要求权衡
- 监控线程池状态:定期监控ActiveCount、QueueSize等指标
- 优雅关闭:使用
shutdown()而非shutdownNow(),给任务完成时间 - 参数调整:通过
setCorePoolSize()、setMaximumPoolSize()动态调整
选择参数时需要综合考虑业务场景、系统资源、任务特性等因素,建议先做压力测试,再根据实际表现进行调整。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播