corePoolSize:表示常驻核心线程数。如果等于0,则任务执行完之后,没有任何请求进入时销毁线程池的线程;如果大于0,即使本地任务执行完毕,核心线程也不会被销毁。这个值的设置非常关键,设置过大会浪费资源,设置过小会导致线程频繁地创建或销毁。
maximumPoolSize:表示线程池能够容纳同时执行的最大线程数。从上方示例代码中的第1处来看,必须大于或等于1。如果待执行的线程数大于此值,需要借助第5个参数的帮助,缓存在队列中。如果maximumPoolSize与corePoolSize相等,即是固定大小线程池。
keepAliveTime:表示线程池中的线程空闲时间,当空闲时间达到 keepAliveTime值时,线程会被销毁,直到只剩下corePoolSize个线程为止,避免浪费内存和句柄资源。在默认情况下,当线程池的线程数大于corePoolSize时,keepAliveTime才会起作用。但是当ThreadPoolExecutor 的allowCoreThreadTimeOut变量设置为true时,核心线程超时后也会被回收。
TimeUnit:表示时间单位。keepAliveTime 的时间单位通常是TimeUnit.SECONDS。
workQueue:表示缓存队列。当请求的线程数大于maximumPoolSize时,线程进入 BlockingQueue阻塞队列。后续示例代码中使用的LinkedBlockingQueue是单向链表,使用锁来控制入队和出队的原子性,两个锁分别控制元素的添加和获取,是一个生产消费模型队列。
threadFactory:表示线程工厂。它用来生产一组相同任务的线程。线程池的命名是通过给这个factory增加组名前缀来实现的。在虚拟机栈分析时,就可以知道线程任务是由哪个线程工厂产生的。
handler:表示执行拒绝策略的对象。当超过第5个参数 workQueue的任务缓存区上限的时候,就可以通过该策略处理请求,这是一种简单的限流保护。