参数名 | 参数含义 |
---|---|
corePoolSize | 核心线程数 |
maximumPoolSize | 最大线程数 |
keepAliveTime | 空闲线程存活时间 |
unit | 时间单位 |
workQueue | 线程池任务队列 |
threadFactory | 创建线程的工厂 |
handler | 拒绝策略 |
corePoolSize:核心线程数意思就是当前线程池中,常备、长就绪状态的线程数有几个,是个int值,表示有几个线程是不管你用不用,线程池都有几个线程等着你用
maximumPoolSize:最大线程数意思是这个线程池最多可以有几个线程,也是int值,但是这个值一点是大于等于核心线程值得,要不然会报错java.lang.IllegalArgumentException,比如最大线程写了10,核心线程写了6,那么多出来的四个就是核心的6个线程都被拿走使用了,可以最多再造四个线程给你用,新生成的线程数+核心线程数永远不会>你写的最大线程数,等生成的线程使用完闲置时候,可以根据下边keepAliveTime的存活时间来回收,最终是全部收回,保留最初的核心线程待命
keepAliveTime:空闲线程存活时间意思如上述,比如6个线程不够用了,又生成了4个线程,等忙完之后,这四个闲置了你设置的这个时间,他就被线程池收回了
unit:时间单位就是回收时间的单位,单位如下表,根据实际情况配置即可
参数 | 含义 |
---|---|
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:线程工厂意思就是由这个方法来创建线程,可以设置线程的名称啊、优先级啊、是不是用户线程啊之类的
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:拒绝策略意思就是,比如你队列最大容量能存200个队列消息,已经有200个消息排队了,第201个来了之后怎么办的意思,默认是AbortPolicy(拒绝并抛出异常:意思就是不处理第201个,并且抛异常)
参数 | 含义 |
---|---|
AbortPolicy | 拒绝并抛出异常 |
CallerRunsPolicy | 使用当前调用的线程来执行此任务 |
DiscardOldestPolicy | 抛弃队列头部(最旧)的一个任务,并执行当前任务 |
DiscardPolicy | 忽略并抛弃当前任务 |