在 Java 中,自定义线程池指的是通过手动创建 ThreadPoolExecutor 实例(而非使用 Executors 工具类提供的默认线程池),并根据业务需求灵活配置核心参数,以实现更合理的线程资源管理。
使用 Executors 工具类(如 Executors.newFixedThreadPool())创建的线程池虽然简单,但可能存在隐藏风险(如无界队列导致内存溢出)。而自定义线程池通过显式配置参数,能更好地适配实际业务场景(如控制并发量、避免资源耗尽等)。
自定义线程池的核心参数(ThreadPoolExecutor 构造方法参数)
ThreadPoolExecutor 的核心构造方法包含 7 个参数,分别控制线程池的行为逻辑,具体如下:
public ThreadPoolExecutor(
int corePoolSize, // 1. 核心线程数
int maximumPoolSize, // 2. 最大线程数
long keepAliveTime, // 3. 空闲线程存活时间
TimeUnit unit, // 4. 时间单位
BlockingQueue<Runnable> workQueue, // 5. 工作队列
ThreadFactory threadFactory, // 6. 线程工厂
RejectedExecutionHandler handler // 7. 拒绝策略
)
1. 核心线程数(corePoolSize)
- 线程池长期保持的最小线程数量(即使线程空闲也不会被销毁,除非设置了
allowCoreThreadTimeOut为true)。 - 当新任务提交时,若当前线程数 < 核心线程数,线程池会优先创建新线程执行任务;若已达到核心线程数,则将任务放入工作队列。
2. 最大线程数(maximumPoolSize)
- 线程池允许创建的最大线程数量(核心线程数 + 临时线程数)。
- 当工作队列已满,且当前线程数 < 最大线程数时,线程池会创建临时线程执行新任务;若已达到最大线程数,则触发拒绝策略。
3. 空闲线程存活时间(keepAliveTime)
- 超过核心线程数的 “临时线程” 在空闲状态下的存活时间。
- 若临时线程空闲时间超过该值,会被销毁,以节省资源。
4. 时间单位(unit)
- 配合
keepAliveTime使用,指定存活时间的单位(如TimeUnit.SECONDS表示秒,TimeUnit.MILLISECONDS表示毫秒)。
5. 工作队列(workQueue)
- 用于存放等待执行的任务的阻塞队列(必须是
BlockingQueue实现类)。 - 常见队列类型:
ArrayBlockingQueue:有界数组队列(需指定容量,避免内存溢出);LinkedBlockingQueue:链表队列(默认无界,建议手动指定容量);SynchronousQueue:同步队列(不存储任务,直接传递给线程,适合任务执行快的场景);PriorityBlockingQueue:优先级队列(按任务优先级排序执行)。
6. 线程工厂(threadFactory)
- 用于创建新线程的工厂,可自定义线程的名称、优先级、是否为守护线程等。
- 默认使用
Executors.defaultThreadFactory(),但建议自定义(如命名线程为业务名-线程池-序号,便于问题排查)。
7. 拒绝策略(handler)
- 当线程池和工作队列都满了(即无法处理新任务)时,对新提交任务的处理策略。
-
示例:创建自定义线程池
import java.util.concurrent.*; public class CustomThreadPoolExample { public static void main(String[] args) { // 自定义线程工厂(指定线程名称) ThreadFactory threadFactory = new ThreadFactory() { private int count = 0; @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName("custom-pool-" + count++); // 线程命名 thread.setDaemon(false); // 非守护线程 return thread; } }; // 创建自定义线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 2, // 核心线程数:2 5, // 最大线程数:5 30, // 空闲线程存活时间:30秒 TimeUnit.SECONDS, // 时间单位:秒 new ArrayBlockingQueue<>(10), // 工作队列:容量为10的有界队列 threadFactory, // 线程工厂 new ThreadPoolExecutor.AbortPolicy() // 拒绝策略:中止策略 ); // 提交任务 for (int i = 0; i < 20; i++) { int taskId = i; threadPool.submit(() -> { System.out.println("任务" + taskId + "由线程" + Thread.currentThread().getName() + "执行"); try { Thread.sleep(1000); // 模拟任务执行 } catch (InterruptedException e) { e.printStackTrace(); } }); } // 关闭线程池 threadPool.shutdown(); } }
总结
自定义线程池的核心是通过 ThreadPoolExecutor 的 7 个参数,灵活控制线程创建、任务排队、资源回收和任务拒绝的逻辑,从而适配不同业务场景(如高并发处理、资源敏感型任务等),避免默认线程池的潜在风险。
Java自定义线程池及其核心参数解析
261

被折叠的 条评论
为什么被折叠?



