线程池好处
- 降低资源消耗
- 提高响应速度
- 提供线程的可管理性
- 提供更多更强大的功能
线程池核心参数
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
| 参数 | 描述 |
|---|
| corePoolSize | 核心线程数 |
| maximumPoolSize | 最大线程数 |
| workQueue | 任务的队列 |
| keepAliveTime | 线程空闲时间 |
| unit | keepAliveTime 参数的时间单位 |
| threadFactory | 执行程序创建新线程时使用的工厂 |
| handler | 超出工作队列和线程池时,任务会默认抛出异常 |
线程池拒绝策略
| 拒绝策略 | 描述 |
|---|
| AbortPolicy | 默认拒绝策略,丢弃任务,抛出RejectedExecutionException |
| DiscardPolicy | 丢弃任务,不抛异常 |
| DiscardOldestPolicy | 丢弃任务队列最早的任务,重新提交当前任务 |
| CallerRunsPolicy | 只要线程池没有被关闭,那么由提交任务的线程自己来执行这个任务 |
线程池任务队列
| 任务队列 | 描述 |
|---|
| ArrayBlockingQueue | 基于数组结构的有界阻塞队列,按 FIFO(先进先出)原则对元素进行排序 |
| LinkedBlockingQueue | 基于链表结构的阻塞队列,按FIFO 排序元素,吞吐量通常高于ArrayBlockingQueue |
| SynchronousQueue | 不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue |
| PriorityBlockingQueue | 具有优先级得无限阻塞队列 |
Exterors常用线程池
| 线程池 | 描述 |
|---|
| newSingleThreadExecutor | 单线程的线程池,按照任务的提交顺序执行 |
| newFixedThreadPool | 固定大小的线程池 |
| newCachedThreadPool | 可缓存的线程池 |
| newScheduledThreadPool | 大小无限的线程池 |
线程池任务提交
| 提交方式 | 描述 |
|---|
| execute | 提交不需要返回值的任务,无法判断任务是否执行成功 |
| submit | 提交需要返回值得任务,会返回一个future类型的对象,可以判断这个任务是否执行成功 |
ThreadPoolExecutor运行状态
| 运行状态 | 描述 |
|---|
| RUNNING | 能接受新提交任务,也能处理阻塞队列中的任务 |
| SHUTDOWN | 关闭状态,不再接受新提交任务,但能继续处理阻塞队列中已保存的任务 |
| STOP | 不接受新任务,也不处理队列中的任务,会中断正在处理任务的线程 |
| TIDYING | 所有任务都已终止,workerCount(有效线程数)为0 |
| TERMINATED | 在terminated()方法执行完进入该状态 |
线程池处理流程

参考资料:
tech.meituan.com/2020/04/02/…