线程池的参数
public ThreadPoolExecutor( int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) { … }
1 corePoolSize 核心线程数
核心线程会一直存活,即使没有任务需要执行。当线程数小于核心线程数时,即使线程池有存在空闲的线程,线程池也会优先创建新线程处理。设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭。
2 maximumPoolSize 最大线程数
当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务。 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常。
3 keepAliveTime 线程空闲时间
当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize。 如果allowCoreThreadTimeout=true,则会直到线程数量=0。
4 TimeUnit 时间单位
一般是MILLISECONDS,SECONDS,MINUTES,线程空闲时间的单位
5 workQueue 等待队列
blockingQueue(FIFO,先进先出)
阻塞体现在两方面
入队时:如果队列空间已满,数据不会消失,等到空间有容纳余地才会入队
出队时:取数据如果队列中没有数据可取,则会等到有入队数据才可以取出
BlockingQueue是个接口,有如下实现类:
5.1 有界队列 ArrayBlockQueue:一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象必须明确大小,像数组一样。
5.2 无界队列 LinkedBlockQueue:一个可改变大小的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。创建其对象如果没有明确大小(如果明确大小就是有界队列),默认值是Integer.MAX_VALUE(此处会造成极大的内存占用,要特别留意)。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
5.3 优先队列(按优先级排序) PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
5.4 同步移交队列 SynchronousQueue:同步队列。同步队列没有任何容量,每个插入必须等待另一个线程移除,反之亦然。
6 threadFactory 线程工厂类
为线程池提供创建新线程的线程工厂。
7 RejectedExecutionHandler 拒绝策略
表示当拒绝处理任务时的策略,有以下四种取值:
AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy:也是丢弃任务,但是不抛出异常。
DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
CallerRunsPolicy:由调用线程处理该任务