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时,新建线程执行任务。
特性二:当池中正在运行的线程数大于等于corePoolSize时,新插入的任务进入workQueue排队(如果workQueue长度允许),等待空闲线程来执行。
特性三:当队列里的任务数达到上限,并且池中正在运行的线程数小于maximumPoolSize,对于新加入的任务,新建线程。
特性四:当队列里的任务数达到上限,并且池中正在运行的线程数等于maximumPoolSize,对于新加入的任务,执行拒绝策略(线程池默认的拒绝策略是抛异常)。
shutdown()方法
当前任务继续执行,无法添加新的任务,否则将会抛出异常,当任务执行完成后,进程结束。
shutdownNow()方法
中断所有任务,并且抛出InterruptedException异常,前提是Runnable中使用
isShutdown()方法
作用是判断线程是否已经关闭,只要调用了shutdown()方法,isShutdown()方法的返回值就是true
isTerminating()和isTerminated()方法
如果程序处于shutdown 或shutdownNow 之后处于正在终止但尚未完全终止的过程中,调用方法 isTerminating(),返回true。
如果线程池关闭后,即任务都完成,则方法isTerminated()返回true。
使用ThreadPoolExecutor线程池的过程中,常用到3种队列
ArrayBlockingQueue、LinkedBlockingDeque和SynchronousQueue。
ArrayBlockingQueue和LinkedBlockingDeque类可以指定队列存储元素的个数,如果未指定个数,默认为 Integer.MAX_VALUE。
对于ArrayBlockingQueue和LinkedBlockingDeque队列
当任务数大于corePoolSize时,多出的部分将会被放入队列中,如果队列满了,将会判断当前线程池中的线程是否超过maximumPoolSize,如果不超过,创建新线程执行任务,如果超过,抛出异常。
对于SynchronousQueue队列
SynchronousQueue队列没有容量,当任务数量大于corePoolSize时,直接创建新的线程,当线程数量大于maximumPoolSize时,抛出异常。
拒绝策略:
- AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出RejectExecutionException异常。
- CallerRunsPolicy:当任务添加到线程池中被拒绝时,会直接使用调用者的线程,执行当前任务,调用者的线程执行性能极有可能急剧下降,因此不建议这么做。
- DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
- DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。