线程池的七大参数是指使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数,分别为:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {}
这几个参数的含义分别是:
参数名 | 参数含义 |
---|---|
corePoolSize | 核心线程数 |
maximumPoolSize | 最大线程数 |
keepAliveTime | 空闲线程存活时间 |
unit | 时间单位 |
workQueue | 线程池任务队列 |
threadFactory | 创建线程的工厂 |
handler | 拒绝策略 |
corePoolSize
核心线程数,是指线程池中长期存活的线程数。int 类型。可以理解为长期存在的、“常驻的”线程。就好比是地主家的长工一样,无论这一年的活多还是活少,都不会被辞退。
maximumPoolSize
最大线程数,是指线程池允许创建的最大线程数量。最大线程数的数量包含核心线程数。int 类型。比如,地主家的活太多了,光要长工可能干不完,需要一些临时工来帮忙,长工的数量 + 临时工的数量 = 最大线程数。
需要注意的是,在创建线程池的时候,最大线程数 maximumPoolSize 不能小于核心线程数 corePoolSize,否则会在程序运行时报异常:
核心线程数为 2,最大线程数为 1,报 java.lang.IllegalArgumentException 异常,但是最大线程数可以等于核心线程数。
keepAliveTime
空闲线程存活时间,指当线程池中没有任务是,会销毁一些线程,销毁的线程数 = maximumPoolSize - corePoolSize。long 类型。
unit
时间单位,指空闲线程存活时间单位,与 keepAliveTime 配合使用。单位为 TimeUnit,常用取值有以下 7 个:
参数 | 含义 |
---|---|
TimeUnit.DAYS | 天 |
TimeUnit.HOURS | 小时 |
TimeUnit.MINUTES | 分钟 |
TimeUnit.SECONDS | 秒 |
TimeUnit.MILLSECONDS | 毫秒 |
TimeUnit.MICROSECONDS | 微秒 |
TimeUnit.NANOSECONDS | 纳秒 |
workQueue
阻塞队列,指线程池存放任务的队列,用来存储线程池的所有待执行的任务。BlockingQueue<Runnable> 类型。取值有以下几种:
参数 | 含义 |
---|---|
ArrayBlockingQueue | 一个由数组结构组成的有界阻塞队列 |
LinkedBlockingQueue | 一个由链表结构组成的有界阻塞队列 |
SynchronousQueue | 一个不存储元素的阻塞队列,即直接提交给线程,不保持它们 |
PriorityBlockingQueue | 一个支持优先级排序的无界阻塞队列 |
DelayQueue | 一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素 |
LinkedTransferQueue | 一个由链表结构组成的无界阻塞队列。与 SynchronousQueue 类似,还含有非阻塞方法 |
LinkedBlockingDeque | 一个由链表结构组成的双向阻塞队列 |
比较常用的是 LinkedBlockingQueue。线程池的排队策略和该参数息息相关。
threadFactory
线程工厂。线程池创建线城市调用的工厂方法,通过此方法可以设置线程的优先级、线程的命名规则以及线程的类型(用户线程还是守护线程)等。ThreadFactory 类型。
public static void main(String[] args) {
// 创建线程工厂
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
// 创建线程池中的线程
Thread thread = new Thread(r);
// 设置线程名称
thread.setName("线程-" + r.hashCode());
// 设置线程优先级
thread.setPriority(Thread.MAX_PRIORITY);
// 设置线程类型(守护线程、用户线程), false-用户线程
thread.setDaemon(false);
return thread;
}
};
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 2,
0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), threadFactory);
threadPoolExecutor.submit(new Runnable() {
@Override
public void run() {
Thread thread = Thread.currentThread();
System.out.println(String.format("线程: %s, 线程优先级: %d",
thread.getName(), thread.getPriority()));
}
});
}
handler
拒绝策略。当线程池的任务超出线程池队列可以存储的最大值之后,拒绝任务的策略。RejectedExecutionHandler 类型。取值有:
参数 | 含义 |
---|---|
AbortPolicy | 拒绝并抛出异常 |
CallerRunsPolicy | 使用当前调用的线程来执行此任务 |
DiscardOldestPolicy | 抛弃队列头部(最旧)的一个任务,并执行当前任务 |
DiscardPolicy | 忽略并抛弃当前任务 |
线程池的默认拒绝策略是 AbortPolicy--拒绝并抛出异常。