
线程池配置主要会涉及到7大参数,下面重点详解7大线程池配置@mikechen
线程池参数配置
线程池参数,如下所示:
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler);
主要会涉及到:corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, handler。
重点是要理解上面的这几个参数,就可以搞清楚线程池配置了。
核心线程数(Core Pool Size)
核心线程数是线程池中保持的活动线程数量,即使线程处于空闲状态也不会被回收。
适用于维护基本的活动线程数,以减少线程创建和销毁的开销。
示例:
int corePoolSize = 5;
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
corePoolSize, Integer.MAX_VALUE,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
最大线程数(Max Pool Size)
最大线程数是线程池允许的最大线程数量,示例:
int maxPoolSize = 10;
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
0, maxPoolSize,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>());
如果任务数量超过核心线程数,且任务队列已满,线程池会创建新线程,直到达到最大线程数。
线程存活时间(Keep-Alive Time)
非核心线程在空闲一段时间后会被销毁,以减少资源消耗,该参数定义了空闲线程的存活时间。
示例:
long keepAliveTime = 60; // 60 seconds
TimeUnit unit = TimeUnit.SECONDS;
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
0, Integer.MAX_VALUE,
keepAliveTime, unit,
new SynchronousQueue<>());
合理设置可以避免因任务突发而频繁地创建和销毁线程。
时间单位(Time Unit)
用于指定核心线程数、最大线程数和线程存活时间的时间单位,如秒、毫秒等。
任务队列(Work Queue)
任务队列用于存储等待执行的任务,可以是有界队列或无界队列。
示例:
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); // Bounded queue with capacity 100
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
corePoolSize, maxPoolSize,
keepAliveTime, unit,
workQueue);
任务队列用于:控制任务的排队和限制任务数量。
拒绝策略(Rejected Execution Policy)
拒绝策略定义了当线程池无法处理新任务时的行为,示例:
RejectedExecutionHandler handler = (r, executor) -> {
// Custom rejection logic
System.out.println("Task rejected: " + r.toString());
};
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
corePoolSize, maxPoolSize,
keepAliveTime, unit,
workQueue, handler);
可选策略有:抛出异常、丢弃任务、丢弃最老的任务、由调用线程执行任务。
根据应用需求选择适当的拒绝策略。
mikechen睿哥
10年+一线大厂架构实战专家,就职于阿里、淘宝等一线大厂,操盘多个亿级大厂核心项目。