本文摘自:
本质
生产者-消费者模式
线程池的使用方式消费者,线程池本身是生产者
主要模型
线程池是一套围绕着核心线程、非核心线程、等待队列的任务调度框架。默认情况,线程池主要结构如下:
corePoolSize 核心线程数
当前线程池中运行的线程数量还没有达到 corePoolSize 大小时,线程池会将任务直接提交给核心线程执行
BlockingQueue 等待队列
如果当前线程池中运行的线程数量已经达到 corePoolSize ,新提交的任务会被加入到 等待队列 中
直到某一个「核心线程」执行任务完毕,处于空闲状态,线程池会 等待队列 中取出一个新的任务执行
maximumPoolSize 最大线程数
当线程数大于corePoolSize
数量,并且等待队列已满,但是还没有达到最大线程数maximumPoolSize
,则线程池会创建新的「非核心线程」来执行任务
RejectedExecutionException 任务拒绝策略
如果提交的任务,无法被核心线程直接执行,又无法加入等待队列,又无法创建“非核心线程”直接执行,线程池将根据拒绝处理器定义的策略处理这个任务
总结
把线程池类比为一个项目组,则线程就是项目组的成员。
corPoolSize 表示线程池保有的最小线程数。有些项目很闲,但是也不能把人都撤了,至少要留 corePoolSize 个人坚守阵地
maximumPoolSize 表示线程池创建的最大线程数。当项目很忙时,就需要加人,但是也不能无限制地加,最多就加到 maximumPoolSize 个人。当项目闲下来时,就要撤人了,最多能撤到 corePoolSize 个人
keepAliveTime & unit 一个线程如果在一段时间内,都没有执行任务,说明很闲,keepAliveTime 和 unit 就是用来定义这个「一段时间」的参数。也就是说,如果一个线程空闲了keepAliveTime & unit 这么久,而且线程池的线程数大于 corePoolSize ,那么这个空闲的线程就要被回收了
workQueue 工作队列
threadFactory 自定义如何创建线程,例如可以给线程指定一个有意义的名字
handler 自定义任务的拒绝策略