线程池,顾名思义,一个存放着线程的池子。
为什么会出现线程池?
- 线程频繁的创建和销毁会对机器的性能有所影响,如果我们能够重复利用线程,避免频繁的创建和销毁可以减小计算机的性能损耗。
- 线程池的核心参数?
- 核心线程数
- 最大线程数
- 线程存活时间
- 等待队列长度
- 线程池拒绝策略
- 任务调度机制?
- 如果当前线程数小于核心线程数,那么就用核心线程执行
- 如果当前线程数大于核心线程数,那么进入等待队列
- 如果等待队列满了,那么创建线程的数量至最大线程
- 如果线程池中已经有了最大线程数,并且等待队列也满了,那么执行拒绝策略。
- 阻塞队列
- ArrayBlocking 基于数组
- LinkedBlocking 基于链表
- Prior 优先队列
- 拒绝策略
- AbortPolicy 直接拒绝
- DiscardPolicy 丢弃任务
- DiscardOldestPolicy 丢弃最前面的任务
- CallerRunsPolicy 调用线程继续执行该任务。
- 线程池调优?
- 区分业务背景
- 快速响应
- 线程池不应该设置等待队列,调高核心线程和最大线程数尽可能创造多的线程快速执行任务
- 快速批量任务
- 离线的大量计算任务,不需要快速响应,我们关系的就是 如何使用有限的资源尽可能在单位时间内更多的处理任务,我们应该设置等待队列,合适的调整核心线程,线程数过多也会引起线程上下文切换频繁的问题,也会降低任务的速度,降低吞吐量
- 快速响应
- 区分业务背景
- 线程池参数设置
- IO 密集
- 特点cpu等待时间长 2n +1
- CPU 密集
- 特点CPU执行时间长 n+1
- 公式: 最佳线程数量: 【 (线程等待时间+线程cpu时间)/ 线程等待时间 】 * CPU核数
- 线程等待时间越高,需要越多线程,等待时间越少,则需要越少线程。
- IO 密集
- 线程池动态参数设置
-
动态参数设置。
-