Bootstrap

线程池七大参数

线程池的七大参数是指使用 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--拒绝并抛出异常。

;