1. 线程池基础与核心原理
在Java并发编程中,线程池是管理线程生命周期的核心组件。理解ThreadPoolExecutor的工作原理是进行高效线程管理的前提。让我们先看一个典型的线程池创建示例:
java复制ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间(秒)
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100), // 任务队列
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
1.1 线程池工作流程解析
线程池处理任务的完整流程可以分为四个关键阶段:
-
核心线程处理阶段:当新任务提交时,如果当前工作线程数小于corePoolSize,线程池会立即创建新线程来处理任务,即使有空闲线程存在。
-
队列缓冲阶段:当核心线程都在忙时,新任务会被放入工作队列。这里需要注意不同队列的实现特性:
- ArrayBlockingQueue:固定大小的有界队列
- LinkedBlockingQueue:可选有界或无界的链表队列
- SynchronousQueue:不存储元素的直接传递队列
-
非核心线程扩展阶段:当队列已满且线程数小于maximumPoolSize时,线程池会创建非核心线程来处理新任务。
-
拒绝策略阶段:当队列已满且线程数达到maximumPoolSize时,触发拒绝策略。常见的四种策略:
- AbortPolicy:直接抛出RejectedExecutionException
- CallerRunsPolicy:由提交任务的线程自己执行
- DiscardPolicy:静默丢弃任务
- DiscardOldestPolicy:丢弃队列中最老的任务
1.2 线程生命周期管理
线程池中的线程有着明确的生命周期管理规则:
- 核心线程:默认情况下会一直存活,即使处于空闲状态。可以通过allowCoreThreadTimeOut(true)设置允许核心线程超时回收。
- 非核心线程:在空闲时间超过keepAliveTime后会被回收。
- 异常处理:当线程执行任务抛出未捕获异常时,该线程会被终止,线程池会创建新线程替代。
重要提示:线程池中的线程都是通过ThreadFactory创建的,自定义ThreadFactory可以设置线程名称、优先级等属性,这对问题排查非常有帮助。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池参数深度调优
2.1 核心参数计算模型
CPU密集型任务配置
对于计算密集型任务,最佳线程数通常与CPU核心数相关:
java复制int corePoolSize = Runtime.getRuntime().availableProcessors(
