构造方法
类ThreadPoolExecutor最常用的构造方法是:
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime
,TimeUnit unit,BlockingQueue<Runnable> workQueue)
corePoolSize:线程池中标准的线程数
maximumPoolSize:线程池中允许的最大线程数
keepAliveTime:超时时间,如果实际线程大于标准线程数,超过的部分将在超时时间过后从空闲线程中删除
unit:keepAliveTime参数的时间单位
workQueue:执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable任务
获取基本属性的一些方法
getCorePoolSize() //获取corePoolSize
getMaximumPoolSize() //获取maximumPoolSize
getPoolSize() //获取线程池中线程实际数量
线程池工作过程
1、当线程池刚创建的时候,里面没有一个线程,任务队列作为参数传进来,不过,就算队列里有任务,线程池也不会马上执行。
2、当执行executor()方法添加一个任务时,线程池会做如下判断
a)如果正在运行的线程数量小于等于corePoolSize,那么马上创建线程运行该任务
b)如果正在运行的线程数量大于corePoolSize,那么将这个任务放入队列
c)如果队列满了,并且正在运行的队列小于maximumPoolSize,创建线程直接加入线程池中。
d)如果队列满了,并且正在运行的队列大于或等于maximumPoolSize,线程池抛出 RejectExecutionException异常
3、当一个线程完成任务,将从队列中取出下一个任务来执行。
4、当一个线程处于空闲状态,超过一定时间(keepAliveTime),线程池会判断,如果当前线程池中的线程超过corePoolSize,那么该线程将会被删除,最终当线程池中的所有任务都完成后,线程的数量会是corePoolSize
ThreadPoolExecutor相关方法
shutdown()方法
当前任务继续执行,无法添加新的任务,否则将会抛出异常,当任务执行完成后,进程结束。
shutdownNow()方法
中断所有任务,并且抛出InterruptedException异常,前提是Runnable中使用
if(Thread.currentThread().isInterrupted()==true){
throw new InterruptedException();
}
isShutdown()方法
作用是判断线程是否已经关闭,只要调用了shutdown()方法,isShutdown()方法的返回值就是true
isTerminating()和isTerminated()方法
如果程序处于shutdown 或shutdownNow 之后处于正在终止但尚未完全终止的过程中,调用方法 isTerminating(),返回true。
如果线程池关闭后,即任务都完成,则方法isTerminated()返回true。
常见的3种队列结合max值的因果效果
使用ThreadPoolExecutor线程池的过程中,常用到3种队列
ArrayBlockingQueue、LinkedBlockingDeque和SynchronousQueue。
ArrayBlockingQueue和LinkedBlockingDeque类可以指定队列存储元素的个数,如果未指定个数,默认为 Integer.MAX_VALUE。
对于ArrayBlockingQueue和LinkedBlockingDeque队列
当任务数大于corePoolSize时,多出的部分将会被放入队列中,如果队列满了,将会判断当前线程池中的线程是否超过maximumPoolSize,如果不超过,创建新线程执行任务,如果超过,抛出异常。
对于SynchronousQueue队列
SynchronousQueue队列没有容量,当任务数量大于corePoolSize时,直接创建新的线程,当线程数量大于maximumPoolSize时,抛出异常。
线程池ThreadPoolExecutor的拒绝策略
线程池中的资源全部被占用的时候,对新添加的Task任务有不同的处理策略,在默认情况下,ThreadPoolExecutor类有4种不同的处理方式。
- AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出RejectExecutionException异常。
- CallerRunsPolicy:当任务添加到线程池中被拒绝时,会直接使用调用者的线程,执行当前任务,调用者的线程执行性能极有可能急剧下降,因此不建议这么做。
- DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
- DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。