【面试八股文 - java基础 - 多线程 - 线程池】

系列文章目录

【面试八股文 - java基础 - 数据结构 - HashMap】
【面试八股文 - 数据库 - MySQL - 索引】
【面试八股文 - java基础 - 多线程 - 锁】



前言


一、 线程池

多线程,
当程序中用到线程,
每次执行都会创建线程,
随着方法调用,线程数会越来越多,
而为了不让线程挤满CPU,
当线程完成自己的使命后会进行销毁,
但是如果线程频繁的创建和销毁也是非常占用资源的,
能不能线程执行完当前的任务就去执行下一个任务,而不销毁呢,
这时候,线程池,就应运而生
专门创建一个盛放线程的池子(容器),
提前将一定数量的线程创建好放在池子中,
有需要执行的任务,就由池子里的线程直接执行,
线程执行完当前任务也就不需要销毁了,
线程还是回到池子中,等待下一个任务,
这样就避免了频繁的线程创建和销毁。


二、参数

1、核心线程数

刚才有提到池子里会提前放一定数量的线程待用,
作为池子里的核心,
这一部分线程是一直存在的,
随着线程池的创建而创建,直到线程池的销毁才销毁,
线程池存在期间,
核心线程可以随时响应任务的执行,
而不需要临时创建,也不会进行销毁。

2、最大线程数

核心线程代表的是线程池的常驻嘉宾,
那么如果临时有大量的任务同时需要执行,
而核心线程数又不够怎么办呢,
这时候线程池也是允许再另外创建线程的,
但同时,线程池创建时又限定了这个最大数量,
做到资源占用的可控性,
以避免创建线程过多导致内存溢出的情况,

3、过期时间

那既然最大线程数说的是会临时创建线程,
这部分临时线程不是核心的,
自然使用完成后会进行销毁,
但实际场景会考虑,
既然已经是大量任务需要同时执行,
而又进行了创建数量的上限的限制,
会不会创建的非核心线程只执行了一部分内容,
会不会还需要他们也继续工作,
所以即使是非核心线程完成当前任务后也不是马上销毁,
是经过过期时间后,一直没有任务,才会执行销毁

PS:之前说的核心线程不会销毁是通常情况下,
但是为了应对一些特殊场景,
核心线程是允许单独设置过期时间的,
核心线程如果设置了过期时间,
而闲置时间又超过过期时间,
那么核心线程也是一样会进行销毁的。

4、时间单位

既然有过期时间,那么还贴心的准备了时间单位也就不足为奇了

5、阻塞队列

有待执行的线程任务优先由核心线程执行,
核心线程满了,由临时创建的非核心线程执行,
那如果非核心线程也达到最大数量了,
剩下的任务我怎么才能等到有线程空闲了来执行呢,
这些任务需要一个进行存储的地方,
就是阻塞队列,
还可以自定义出队顺序,
让优先度更高的任务先被空闲线程执行

6、线程工厂

其实我觉得线程工厂应该排在第一位,
毕竟线程池进行线程创建这肯定是要用到线程工厂的,
不过这里就直接采用创建线程池的参数顺序了

7、拒绝策略

核心线程,非核心线程,阻塞队列,
但终归人力有时穷,
为了防止内存溢出,堆栈溢出,
总归线程池能接收的任务是要有一个上限的,
那么到达上限了之后怎么办呢,
如果没有特殊需求,
通常是以下四种方式进行拒绝,
1.我真的没办法了,你自己处理吧,
由调用线程自己处理任务,
2.对不起,我就是不能处理了
直接报错返回异常
3.静默
不报错,也不处理
4.你真的要执行啊?那我想想办法吧
丢弃队列中最老的任务,将当前任务入队

如果实际使用中经常出现拒绝情况,
或对被拒绝任务有其他特殊处理,
也可以继承拒绝接口,重写拒绝方法,
自定义一个拒绝策略。


三、通用线程池

如果觉得创建线程池麻烦,
而且又只是非常简单的业务场景,
其实是有四个已经给定义好的通用线程池供选用的,
虽然规范中觉得线程本就是资源占用大户,
而线程池又是管理线程的,属于非常重要的内容,
应该认真揣摩每一个线程池参数,
创建出一个刚刚好的线程池才对,
不建议使用通用的那四个线程池就是了

1、单线程线程池

核心和最大线程数量都是一,
不需要过期时间,
阻塞队列为无限队列,
所有任务都顺序的执行,
适用于线程较少的场景。

2、定长线程池

入参为核心和最大线程数,
没有过期时间,
阻塞队列为无限队列,
适合于每次需要运行线程数固定的场景。

3、缓存线程池

没有核心线程,最大线程数为int最大值,
过期时间60s,
阻塞队列为同步队列,
适用于大量的比较快能执行完成的小任务场景。

4、计划线程池

入参为核心线程数,最大线程数为int最大值,
没有过期时间,
阻塞队列为延迟队列,
延迟队列专门用来储存可执行的定时任务。


总结

昨天码字码到走火入魔,约码眼睛越疼,疼还是坚持码,闭着眼睛凭手感码字,最后实在疼的不行,跑一边去彻底闭眼运功调息,最后还是今天才写完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破晓星芒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值