文章目录

  • ​​线程池使用及优势​​
  • ​​线程池的3个常用方式​​
  • ​​架构说明​​
  • ​​编码实现​​
  • ​​线程池7大核心参数入门简介​​
  • ​​线程池7大参数深入介绍​​
  • ​​线程池底层工作原理​​
  • ​​线程池的拒绝策略理论讲解​​
  • ​​实际工作中实际使用哪一种线程池​​
  • ​​线程池的手写改造和拒绝策略​​
  • ​​线程池配置合理线程数​​

线程池使用及优势

12.互联网大厂高频面试题-线程池_多线程


只要是new thread,就会产生资源的消耗,就需要GC来回收,多核时代,硬件上已经支持多核心处理多个任务,而不是一个核心进行上下文的切换。想一下spring,需要对象,是不需要new的,因为是依赖注入,提前在容器里新建好了。

12.互联网大厂高频面试题-线程池_阻塞队列_02

线程池的3个常用方式

12.互联网大厂高频面试题-线程池_线程池_03

架构说明

12.互联网大厂高频面试题-线程池_阻塞队列_04

12.互联网大厂高频面试题-线程池_多线程_05


12.互联网大厂高频面试题-线程池_线程池_06


线程池的底层就是ThreadPoolExecutor。扩展说明:数组,集合,线程池都有一个屁股后面加s的辅助工具类。

12.互联网大厂高频面试题-线程池_线程池_07


12.互联网大厂高频面试题-线程池_线程池_08

编码实现

12.互联网大厂高频面试题-线程池_阻塞队列_09


12.互联网大厂高频面试题-线程池_线程池_10


ScheduledThreadPool:是带调度的线程池,可以执行定时任务。

WorkStealingPool:是java8的新特性。

12.互联网大厂高频面试题-线程池_线程池_11


主要有3种类型的线程池,自己知道是5种就行,加上上面那2种。

java中的第四种(继承thread、实现runable,实现callable,线程池)使用线程的方式—线程池。特性:一池固定线程,一池一线程,一池多线程,分别对应上面三种,看名字就可以对上了。

池化资源,关闭比使用更重要!

12.互联网大厂高频面试题-线程池_多线程_12


凡是做并发系统,必然有池。

12.互联网大厂高频面试题-线程池_阻塞队列_13


执行结果:不过多少人,最多同时支持5个在线,控制了并发,同时任务被积攒。没有拒绝。

12.互联网大厂高频面试题-线程池_阻塞队列_14


一池一线程是一池固定线程的特殊情况。代码如下:

12.互联网大厂高频面试题-线程池_阻塞队列_15


运行结果:

12.互联网大厂高频面试题-线程池_阻塞队列_16


一池多线程,当出现并发的时候,根据处理的情况,弹性新建线程。

12.互联网大厂高频面试题-线程池_多线程_17


执行结果会根据并发和处理情况,新建线程。

12.互联网大厂高频面试题-线程池_阻塞队列_18

看一下源代码:

12.互联网大厂高频面试题-线程池_阻塞队列_19


12.互联网大厂高频面试题-线程池_线程池_20


12.互联网大厂高频面试题-线程池_多线程_21


底层代码的核心是ThreadPoolExecutor

逐一分析:针对固定线程线程池。

12.互联网大厂高频面试题-线程池_线程池_22


12.互联网大厂高频面试题-线程池_线程池_23


12.互联网大厂高频面试题-线程池_多线程_24


线程池的核心:ThreadPoolExecutor和阻塞队列,阻塞队列决定了特性。

线程池7大核心参数入门简介

12.互联网大厂高频面试题-线程池_阻塞队列_25

12.互联网大厂高频面试题-线程池_阻塞队列_26


12.互联网大厂高频面试题-线程池_多线程_27

综合看一下ThreadPoolExecutor:

12.互联网大厂高频面试题-线程池_多线程_28

可以看到常见的五大参数。实际上是有7个。可以看一下ThreadpoolExecutor的源码,构造方法有7个参数。

12.互联网大厂高频面试题-线程池_线程池_29


7参构造方法如下:

12.互联网大厂高频面试题-线程池_阻塞队列_30

线程池7大参数深入介绍

12.互联网大厂高频面试题-线程池_多线程_31

12.互联网大厂高频面试题-线程池_线程池_32


12.互联网大厂高频面试题-线程池_阻塞队列_33


12.互联网大厂高频面试题-线程池_线程池_34


12.互联网大厂高频面试题-线程池_线程池_35


核心数:当值窗口,最大数:银行的最大处理窗口数。空闲线程的存活时间是3.4两个参数。5是来不及处理的任务的存放区,相当于候客区。6是线程工厂,用默认的即可。7是拒绝策略,当处理窗口全开,然后候客区也满了,就需要拒绝新的任务的添加了。

具体的触发逻辑,默认开2个窗口(核心线程数),

线程池的执行逻辑,线程池建立,就会有核心数个线程被创建出来等待任务的提交,核心线程被使用之后,新来任务就放在阻塞队列中,如果阻塞队列也满了,说明业务量激增,线程池会增加线程直到等于max(第二个参数),处理完业务峰值之后,如果增加的线程在规定时间(3.4个参数)内没有分配到任务,则会被销毁,释放资源。如果,业务一直增加,线程数到达了最大,阻塞队列也满了,则开始拒绝策略,默认有4种。第六个参数是创建什么样的线程,一般用默认的就行。

线程池底层工作原理

12.互联网大厂高频面试题-线程池_线程池_36


12.互联网大厂高频面试题-线程池_阻塞队列_37


12.互联网大厂高频面试题-线程池_阻塞队列_38


12.互联网大厂高频面试题-线程池_多线程_39

线程池的拒绝策略理论讲解

12.互联网大厂高频面试题-线程池_多线程_40


是什么:

12.互联网大厂高频面试题-线程池_阻塞队列_41


拒绝策略有4种:

12.互联网大厂高频面试题-线程池_阻塞队列_42


12.互联网大厂高频面试题-线程池_多线程_43

实际工作中实际使用哪一种线程池

12.互联网大厂高频面试题-线程池_线程池_44


正确答案是:一个都不用。

12.互联网大厂高频面试题-线程池_阻塞队列_45


阿里巴巴手册:规定不允许new 线程的同时,不允许使用默认的。因为会oom。这就是不能用的原因!

12.互联网大厂高频面试题-线程池_线程池_46


12.互联网大厂高频面试题-线程池_线程池_47

线程池的手写改造和拒绝策略

12.互联网大厂高频面试题-线程池_多线程_48


实现下图的线程池:

12.互联网大厂高频面试题-线程池_多线程_49


2核心数,5最大数,5s的空闲时间,赋初值3的阻塞队列(不赋初值是21亿)。

12.互联网大厂高频面试题-线程池_线程池_50


线程工厂用默认的:

12.互联网大厂高频面试题-线程池_阻塞队列_51


饱和以后的拒绝策略:使用默认的Abort策略。

最终效果如下:

12.互联网大厂高频面试题-线程池_线程池_52


这个线程池支持的最大线程数是(max+阻塞队列size)8,设置9个线程就爆炸了:

12.互联网大厂高频面试题-线程池_多线程_53


看一下拒绝策略:

12.互联网大厂高频面试题-线程池_线程池_54


默认的这种一旦超出承受能力就报异常,生产肯定不能用。

第二种拒绝策略测试代码:

12.互联网大厂高频面试题-线程池_阻塞队列_55


运行结果:10个请求没有爆炸。

12.互联网大厂高频面试题-线程池_多线程_56


类似去银行,银行满了之后,问顾客从哪里来,可以再回去之前的银行试试。这就是策略二的调节机制。

最后发现是主线程帮着执行了一个任务。

12.互联网大厂高频面试题-线程池_多线程_57


12.互联网大厂高频面试题-线程池_多线程_58


最后这两种都是丢弃,个人很不建议使用,不允许丢失请求的。

线程池配置合理线程数

核心线程数,最大线程数如何配置才合理呢?

12.互联网大厂高频面试题-线程池_多线程_59


根据业务去考虑,CPU密集型还是IO密集型。

12.互联网大厂高频面试题-线程池_线程池_60


12.互联网大厂高频面试题-线程池_线程池_61


io密集型的例子:比如不停的从数据库里面读取。

第一种:

12.互联网大厂高频面试题-线程池_阻塞队列_62


第二种:

12.互联网大厂高频面试题-线程池_线程池_63


这里面说的是最大线程数,核心线程数等于0都可以(缓冲线程池底层的初始值就是0).