线程池
线程池,一般在使用中是用Executors的静态方法来新建出来的。比如new FixxedThreadPool new CachedThreadPool new SingleThreadPool ,这三个是比较常用的情景,但当有限特殊情况下需要自己定义自己业务场景的线程池来使用。我们先来看在JDK1.5版本中ThreadPoolExecutor这个类;因为前者三种新建线程池的方法其实都是这里衍生出来的
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}```
参数介绍:
corePoolSize 核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作)。
maximumPoolSize 指的是线程池的最大大小(线程池中最大有corePoolSize 个线程可运行)。
keepAliveTime 指的是空闲线程结束的超时时间(当一个线程不工作时,过keepAliveTime 长时间将停止该线程)。
unit 是一个枚举,表示 keepAliveTime 的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值)。
workQueue 表示存放任务的队列(存放需要被线程池执行的线程队列)。
handler 拒绝策略(添加任务失败后如何处理该任务).
Executors.defaultThreadFactory():默认线程工厂
defaultHandler: 默认的策略 拒绝
`
实际执行流程
1、在任务数小于corepoolsize时,来任务就新建一个线程来跑任务
2、线程数为corepoolsize时,任务数量超过corepoolsize时,任务会到workQueue阻塞队列中
3、当阻塞队列放不下了,当maxmumpoolsize大于corePoolSize时候,会启用线程来跑队列中的任务
4、当储备线程 和 队列中都满的时候,这个ThreadPoolExecutor实在没能力处理线程了,就会执行拒绝策略,实在吃不下了,抛rejectedException异常吧。