面试的时候往往会问到线程池相关的内容,对于线程池知其然而不知其所以然。本篇文章通过源码阐述线程池构造方法、详细参数信息(核心线程数量、最大线程数量、空闲等待时间、线程工厂、拒绝策略)及线程池的使用。
本 Chat 读者将获得以下知识:
- 线程池简介
- 线程池优点
- 线程池构造
- 线程池详细参数信息
- 使用 Executors 构造线程池的方法及对比
- 使用线程池默认构造方法创建线程池
- 线程池状态描述
- 线程池常用方法解析
- 线程池监控常用方法
适合人群: 小白及 Java 初中级开发。
-
-
- 认识线程池
- corePoolSize
- maximumPoolSize
- keepAliveTime
- threadFactory
- rejectedExecutionHandler
- 创建线程池
- newFixedThreadPool
- newSingleThreadExecutor
- newCachedThreadPool
- newScheduledThreadPool
- 线程池状态
- 常用方法
- 线程池监控
- 认识线程池
-
线程池是什么?线程池就是存放一定量线程的容器,当有待执行任务的时候直接从线程池中取出线程执行任务,任务执行完成之后将线程回放至线程池中。
线程池的优点:降低了线程频繁创建、销毁的开销,提高系统的响应速度,方便统一管理创建的线程。
线程池(ThreadPoolExecutor)提供 4 个默认的构造方法,固定参数 5 个。如下图:
详细参数解释如下:
- 核心线程数量:corePoolSize
- 最大线程数量:maximumPoolSize
- 非核心线程空闲等待时间:keepAliveTime
- 等待时间单位:timeUnit
- 等待阻塞队列:blockingQueue
- (可选)线程工厂创建线程:threadFactory
- (可选)线程池拒绝策略:rejectedExecutionHandler
线程池中默认存活的线程数量。不同的线程池对于核心线程数量有不同的要求,也与 allowCoreThreadTimeout 参数有关。
当 allowCoreThreadTimeout= true
时,核心线程没有任务且存活时间超过空闲等待时间后终止。
线程池中允许的最大线程数量。
当 currentThreadNumber >= corePoolSize
,且任务队列已满时,线程池会创建新线程来处理任务;当 currentThreadNumber =maxPoolSize
,且任务队列已满时,线程池会拒绝处理任务而抛出异常。
线程池中空闲线程允许存活的时间,超过配置时间将会被终止。
blockingQueue:线程池缓存队列存放待处理的线程任务。
ArrayBlockingQueue:指定大小的等待队列(FIFO);有界队列,创建时需要指定队列的大小。
LinkedBlockingQueue:基于链表的等待队列(FIFO);无界队列,创建时不指定队列大小,默认为 Integer.MAX_VALUE。
PriorityBlockingQueue:带有优先级的等待队列
SynchronizedQueue:不存放对象的等待队列;同步移交队列,直接新建一个线程来执行新来的任务。
线程工厂,创建线程使用。
rejectedExecutionHandler当线程池的任务缓存队列已满并且线程池中的线程数目达到 maximumPoolSize 时,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:
- AbortPolicy(默认策略):丢弃任务并抛出 RejectedExecutionException。
- CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
- DiscardOldestPolicy:丢弃队列中最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务(舍弃最老的请求,即将队列头部任务舍弃)。
- DiscardPolicy:不做任何处理,直接丢弃任务。
线程池的创建主要有 2 种方式:基于 ThreadPoolExecutor 的构造方法创建和 Executors 执行器创建。Executors 执行器创建线程池是在 ThreadPoolExecutor 构造方法上进行简单的封装,特殊场景根据需要自行创建。
阅读全文: http://gitbook.cn/gitchat/activity/5f1908a9571fef308a5b1b59
您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。