maximumpoolsize 是 java 线程池的核心配置参数,它定义了线程池允许创建的最大线程数量。当任务队列已满且当前活跃线程数小于该值时,线程池会尝试创建新线程来执行提交的任务;若超过此限制,则会根据拒绝策略处理多余任务。

核心线程数与最大线程数的区别是什么
核心线程数 corePoolSize 表示线程池中保持存活的最小线程数量,即使这些线程处于空闲状态也不会被回收(除非设置了 allowCoreThreadTimeOut)。而 maximumPoolSize 则是上限。在常见的 ThreadPoolExecutor 工作流程中,新任务提交时,如果当前线程数少于 corePoolSize,优先创建核心线程;只有当核心线程都在忙且任务队列已满时,才会继续创建非核心线程直到达到 maximumPoolSize。

import java.util.concurrent.*;
public class PoolDemo {
public static void main(String[] args) {
// 核心线程数2,最大线程数4,队列容量2
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 4, 60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(2)
);
// 提交6个任务
for (int i = 1; i {
System.out.println("Task " + taskId + " running on " + Thread.currentThread().getName());
try { Thread.sleep(2000); } catch (InterruptedException e) {}
});
}
executor.shutdown();
}
}
在上述代码中,前2个任务直接由核心线程执行。第3、4个任务进入队列等待。当第5个任务到来时,队列已满且核心线程忙碌,线程池会创建第3个线程(非核心)来执行。第6个任务到来时,同样创建第4个线程。此时活跃线程数达到最大值4。如果再提交第7个任务,由于队列满且线程数已达最大,将触发拒绝策略。
任务队列满了之后线程池如何响应
当任务队列饱和且当前线程数已达到 maximumPoolSize 时,线程池无法再容纳新任务,此时会调用 RejectedExecutionHandler 进行处理。默认的拒绝策略是 AbortPolicy,它会抛出 RejectedExecutionException 异常。开发者也可以自定义策略,如 CallerRunsPolicy(由提交任务的线程直接执行)、DiscardPolicy(静默丢弃)或 DiscardOldestPolicy(丢弃队列中最老的任务)。

import java.util.concurrent.*;
public class RejectionDemo {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(0), // 无界队列会导致maximumPoolSize失效,这里用有界队列演示
new ThreadPoolExecutor.CallerRunsPolicy() // 使用调用者运行策略
);
// 模拟快速提交大量任务
for (int i = 0; i {
System.out.println(Thread.currentThread().getName() + " executing task");
});
}
executor.shutdown();
}
}
在这个例子中,由于队列容量为0,一旦核心线程忙碌,新任务会立即尝试创建新线程。当线程数达到1后,后续任务因队列满且线程数达最大,将由主线程(Caller)直接执行。这体现了 maximumPoolSize 与队列大小共同决定的并发边界。
为什么设置过大的 maximumPoolSize 可能导致问题
如果 maximumPoolSize 设置得过大,例如设置为 Integer.MAX_VALUE,在线程池使用无界队列(如 LinkedBlockingQueue)时,该参数实际上会被忽略,因为任务永远能进入队列,不会触发创建非核心线程的逻辑。即使使用有界队列,过大的最大值也会导致系统同时创建大量线程,消耗过多的 CPU 和内存资源,引发上下文切换开销剧增甚至 OOM(OutOfMemoryError)。因此,通常建议根据 CPU 密集型或 IO 密集型任务的特点,结合队列容量合理设置该值,而非盲目调大。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











