executors.newfixedthreadpool(nthreads) 创建核心与最大线程数均为nthreads、使用无界linkedblockingqueue的线程池,等价于指定corepoolsize=maxpoolsize=nthreads、keepalivetime=0l、abortpolicy拒绝策略;需注意内存溢出、拒绝策略不可定制、线程名无意义及必须显式关闭等问题。

Java 中使用 Executors.newFixedThreadPool(int nThreads) 可以快速创建一个固定大小的线程池,它内部基于 ThreadPoolExecutor 实现,核心线程数和最大线程数都等于你指定的 nThreads,且使用无界队列(LinkedBlockingQueue)。
创建方式与基本用法
只需传入期望的线程数量即可:
-
ExecutorService pool = Executors.newFixedThreadPool(4);创建一个最多维持 4 个线程的池 - 提交任务用
pool.submit(Runnable task)或pool.execute(Runnable task) - 不再使用时调用
pool.shutdown(),建议配合awaitTermination等待任务结束
背后的 ThreadPoolExecutor 参数
这个工厂方法等价于:
-
corePoolSize =
nThreads -
maximumPoolSize =
nThreads - keepAliveTime = 0L(因为线程数不会动态伸缩,该参数实际不生效)
-
workQueue =
new LinkedBlockingQueue<runnable>()</runnable>(容量为Integer.MAX_VALUE) -
threadFactory = 默认的
Executors.defaultThreadFactory() -
handler =
AbortPolicy(队列满时直接抛出RejectedExecutionException)
需要注意的典型问题
虽然方便,但有几点容易踩坑:
- 无界队列可能导致内存溢出:大量任务提交又来不及处理时,任务会持续堆积在队列中
- 无法自定义拒绝策略:如需重试、丢弃旧任务或由调用线程执行,得手动构造
ThreadPoolExecutor - 线程名默认无意义:不利于排查问题,可通过自定义
ThreadFactory设置命名规则 - 未显式关闭会导致 JVM 无法退出:务必在合适时机调用
shutdown()或shutdownNow()
简单示例代码
以下是一个安全使用的最小完整示例:
ExecutorService pool = Executors.newFixedThreadPool(3);
try {
for (int i = 0; i System.out.println("Task " + taskId + " running on " + Thread.currentThread().getName()));
}
} finally {
pool.shutdown();
try {
if (!pool.awaitTermination(5, TimeUnit.SECONDS)) {
pool.shutdownNow();
}
} catch (InterruptedException e) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











