Java线程池
- 池化技术:池化技术是一种缓存需要复用的东西到池中;以避免重复创建、销毁的性能开销
- 线程池执行逻辑
- Java中线程池拥有三种级别的线程容器
- 核心线程(优先级最高)
- 等待队列
- 非核心线程(优先级最低)
- Java线程池主要参数含义
- corePoolSize:线程池拥有核心线程数目
- maximumPoolSize:线程池拥有最大线程数目
- ctl:有效线程执行数目
- threadFactory:线程创建的工厂
- RejectedExecutionHandler:线程池饱和的拒绝策略
- keepAliveTime:线程存活时间
- BlockingQueue:任务等待队列
- Java线程池的主要队列类型
队列名称 | 中文解释 |
SynchronousQueue | 同步队列 |
LinkedBlockingQueue | 无边界队列 |
ArrayBlockingQueue | 有界队列 |
- 同步队列以及无边界队列都有可能导致线程的长时间等待
- 无边界队列的取舍?
- 大池小队列:降低系统CPU的使用率以及系统资源的使用率,但是系统的吞吐量会人为下降
- 小池大队列:提升系统的CPU切换频繁,系统的吞吐量也会受影响
- 线程池的状态
状态名称 | 解释 |
RUNNING | 接受新任务并处理排队任务 |
SHUTDOWN | 不接受新任务,但处理排队任务 |
STOP | 不接受新任务,不处理排队任务,中断进行中的任务 |
TIDYING | 所有任务都已终止,workerCount为零,当状态为TIDYING时,会执行terminated() |
TERMINATED | 执行完terminated(),线程池会处于此状态 |
- 线程池种类
- newFixedThreadPool
- 重用固定数目线程的线程池
- newWorkStealingPool
- 支持线程并行度的线程池,支持并行处理任务,但是不保证有序
- newSingleThreadExecutor
- 核心线程数目、最大线程池都为1的线程池
- newCachedThreadPool
- 该线程池不存在核心线程数目,但是线程池大小为Integer的最大值,会缓存线程,此线程池的所有线程的生命时间为60S
- newSingleThreadScheduledExecutor
- 可执行线程数目最大为1的任务周期循环调度单线程执行器
- newScheduledThreadPool
- 与newSingleThreadScheduledExecutor类似,只不过这个支持多线程,newSingleThreadScheduledExecutor只支持单线程
- 线程池的线程容器依赖
线程池名称 | 容器名称 |
newFixedThreadPool | LinkedBlockingQueue |
newSingleThreadExecutor | LinkedBlockingQueue |
newCachedThreadPool | SynchronousQueue |
newSingleThreadScheduledExecutor | DelayedWorkQueue |
newScheduledThreadPool | DelayedWorkQueue |
- 线程池的大小取舍
- 线程数目的选择在于压榨CPU的性能
- CPU密集型:存在大量CPU计算,IO的时间很短
- 若为单CPU=1:则PoolSize=1;因为同时只能处理一个,因此核心线程数目设置为1,减少了线程切换的开销
- 若为多CPU=n:则PoolSize=n+1;保证当一个CPU处理完成后,能够立即执行其余的线程
- IO密集型:存在大量IO,CPU计算时间短
- 设CPU个数为n,则线程池大小应该为2n,假设当前所有线程需要IO,此时CPU需要n的线程才不会空转