ThreadPoolExecutor使用总结
流程图
构造参数
corePoolSize
核心线程数:
- 默认情况下,核心线程即使空闲也不会被销毁
- 添加新任务时,如果总工作线程数小于corePoolSize,无论当前工作线程是否空闲,都会直接创建新线程
- 添加新任务时,如果总工作线程数大于或等于corePoolSize,任务添加到工作队列
maximumPoolSize
最大线程数:
- 线程池的总线程数上限
- 添加任务时,如果工作队列已满且总工作线程数等于maximumPoolSize,则会执行拒绝策略
keepAliveTime
多余空闲线程存活时间:
- 默认情况下,线程池至少保持corePoolSize数量的线程永久存活,数量超过corePoolSize值后,如果有线程空闲时间达到keepAliveTime值,则会被销毁
如果allowCoreThreadTimeOut值被设置为true时,所有空闲时间超过keepAliveTime值的线程都会销毁
unit
【多余空闲存活时间】的时间单位
workQueue
工作队列:
- 工作线程数达到corePoolSize值后,任务加入工作队列
- 工作队列满后且当前工作线程数小于maximumPoolSize,则创建新线程执行任务
常用队列:
- ArrayBlockingQueue:数组实现,初始化指定大小,初始化后固定容量;先进先出
- LinkedBlockingQueue:链表实现,默认大小Integer.MAX_VALUE,初始化后固定容量;先进先出
- PriorityBlockingQueue:数组实现,初始化指定大小,容量满后自动扩容,最大(Integer.MAX_VALUE - 8);根据任务对象排序
threadFactory
线程工厂:
- 用于创建工作线程,默认用Executors.defaultThreadFactory()
handler
拒绝策略:
- 用于队列不能添加任务且工作线程数达到maximumPoolSize值时的拒绝策略,默认用ThreadPoolExecutor.AbortPolicy
- AbortPolicy:直接抛出RejectedExecutionException异常
- CallerRunsPolicy:如果当前线程池已关闭则直接放弃任务,否则直接运行(在调用者线程中同步运行,慎用)
- DiscardOldestPolicy:如果当前线程池已关闭则直接放弃任务,否则丢弃一个最老的任务,调用线程池execute方法执行当前任务
- DiscardPolicy:直接放弃