线程池
线程池的参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
线程池包含着七个参数
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:线程存活时间
unit:存活时间单位
workQueue:阻塞队列,用于存放任务
threadFactory:创建线程的工厂,一般我们会自定义工厂,用于设置线程的名称
handler:拒绝策略,线程池默认提供了四个拒绝策略
AbortPolicy:直接抛出异常
DiscardPolicy:直接丢弃当前任务
DiscardOldestPolicy:丢弃最早的任务
CallerRunsPolicy:使用任务线程执行当前的任务
那么这些参数在线程池中是如何工作的呢
首先,会判断线程池中的线程是否大于核心线程数corePoolSize,如果不大于,线程池则创建一个线程(使用定义的线程工厂[threadFactory]创建线程),执行当前的任务,如何大于,则判断线程池的阻塞队列(workQueue)是否已满,如果未满,则将任务添加到阻塞队列中,如果阻塞队列已满,则判断线程池的线程数是否大于最大线程数(maximumPoolSize),如果不大于,则创建一个线程执行当前的任务,如果线程池的线程数已达到最大线程数则执行拒绝策略(handler),当核心线程允许被回收或者线程池的线程数超过核心线程数时,线程会在等待了线程的空闲时间后,会被线程池回收。
线程池是否区分核心线程和非核心线程
在线程池中,实际是不区分核心和非线程线程的,这些线程在线程池中的地位是一样的,当线程池中的线程处于空闲状态并且线程处于可回收状态(1:线程池中的线程大于核心线程数,2:线程池可以回收核心线程),此时,线程从阻塞队列中读取任务会通过带超时时间的take方法获取任务,当take方法超时时,线程便会被回收。