提纲:
基础八股知识🔥
参数
corePoolSize
maximumPoolSize
keepAliveTime
BlockingQueue
TimeUnit
ThreadFactory
handler
获取方式
工作原理
优点
使用场景
面试八股真题🎈
1、常用的线程池有哪些
2、简述一下你对线程池的理解
3、线程池核心线程数怎么设置
4、Java线程池中队列常用类型有哪些
5、线程安全需要保证几个基本特征
6、线程池原理知道吗?以及核心参数
7、线程池的拒绝策略有哪些
一、基础八股知识点
1. 参数
-
corePoolSize:
-
核心线程数,即工作线程数
-
-
maximumPoolSize:
-
最大线程数,最大线程数 - 核心线程数 = 救急线程数
-
-
keepAliveTime:
-
救急线程的存活时间
-
-
BlockingQueue:
-
阻塞队列,用来存放任务对象
-
种类:
-
ArrayBlockingQueue:数组实现的阻塞队列,有存储上限
-
LinkedBlockingQueue:双向链表实现的阻塞队列,没有容量上限
-
SychronizedBlockingQueue:特殊的阻塞队列,容量为 0,即一个生产者想放入任务时,必须有一个消费者可以取
-
PriorityBlockingQueue:优先级等待队列,根据任务的优先级大小排序,每次取出堆顶的任务,没有容量限制
-
-
-
TimeUnit:
-
存活时间的单位
-
-
ThreadFactory:
-
用来创建工作线程
-
-
handler:拒绝策略
-
默认为抛出异常,并丢弃该任务
-
交还给生产者线程自己执行
-
替换阻塞队列中队头的任务
-
直接丢弃该任务
-
2.获取方式
-
使用 ThreadPoolExcutor 自己传入参数获取一个标准的线程池
-
使用 Excutors 获取特定功能的线程池,如 ScheduledThreadPool 提供延时和定时执行功能的线程池
3.工作原理
-
生产者线程调用 excute 方法传入 Runable 的对象提交任务
-
线程池收到任务对象,判断当前工作线程数是否小于核心线程数,若小于,创建工作线程并执行,工作线程会不断从阻塞队列中获取任务进行执行
-
若工作线程已经达到核心线程数,将任务放入阻塞队列
-
若阻塞队列使用的 ArrayBlockingQueue,会有存储上限,若达到存储上限,判断当前线程数是否大于最大线程数,若不大于,创建救急线程处理任务
-
救急线程处理完任务后,若没有到达销毁救急线程的时间,就会不断从阻塞队列中获取任务并执行
-
若当前线程数到达最大线程数,即救急线程也不够用了,就调用