【Java八股-第五期】线程池 - Java基础
提纲:
基础八股知识🔥
参数
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,会有存储上限,若达到存储上限,判断当前线程数是否大于最大线程数,若不大于,创建救急线程处理任务
-
救急线程处理完任务后,若没有到达销毁救急线程的时间,就会不断从阻塞队列中获取任务并执行
-
若当前线程数到达最大线程数,即救急线程也不够用了,就调用 handler 拒绝策略的具体方法
4.优点
-
当存在大量任务时,为每一个任务创建一个线程不仅无法提高执行效率,还会增加创建和销毁线程的大量额外开销,使用线程池体现了享元的思想,使线程可以反复使用
-
在任务传入线程池时,不需要等待创建线程即可执行,提高了速度
5.使用场景
-
定时发送邮件
-
定时心跳检测
二、面试八股真题🎈🎈🎈
1、常用的线程池有哪些
-
newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
-
newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
-
new
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【📫专栏目录在最底部📫】 - 本专栏适合于JAVA已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了JAVA、Spring、计算机网路、操作系统、计算机网络、MySQL、算法与数据结构、中间件等一系列知识点,总结出了高频面试考点(附有答案),事半功倍,为大家春秋招助力。 - 本专栏内容分为五章