1,原理
任务执行 execute后,会先判断是否小于核心线程数,小于则进入线程池进入工作队列
线程池再去 获取队列里的阻塞任务;大于核心线程数时,则执行拒绝策略(AbortPolicy:丢弃任务,抛出运行时异常;
CallerRunsPolicy:由提交任务的线程来执行任务;
DiscardPolicy:丢弃这个任务,但是不抛异常;
DiscardOldestPolicy:从队列中剔除最先进入队列的任务,然后再次提交任务)。
如果添加任务到队列失败了,会先添加到非核心线程中,如果添加到非核心线程中也失败了,则会拒绝这个任务。
2,参数:
corePoolSize:核心线程数量,线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:线程池除核心线程外的其他线程的最长空闲时间,超过该时间的空闲线程会被销毁
unit:keepAliveTime的单位,TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS
workQueue:线程池所使用的任务缓冲队列
threadFactory:线程工厂,用于创建线程,一般用默认的即可
handler:线程池对拒绝任务的处理策略
3,线程池的执行过程
1)如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
2)如果此时线程池中的数量等于corePoolSize,但是缓冲队列workQueue未满,那么任务被放入缓冲队列。
3)如果此时线程池中的数量大于等于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
4)如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
5)当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
总结即:处理任务判断的优先级为 核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
4,常用队列
ArrayBlockingQueue:这是一个由数组实现的容量固定的有界阻塞队列.LinkedBlockingQueue提供了一个可选有界的构造函数,而在未指明容量时,容量默认为Integer.MAX_VALUE。