面试八股之线程篇6.3——面试真实场景——线程池

hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
人生之义,在于追求,不在成败,勤通大道。加油呀!

个人主页:Ethan Yankang
专栏:史上最强八股文||Java项目

温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

本篇概览:详细讲解了线程池在面试中的真实提问


目录

6.3 线程池

面试官:线程池的种类有哪些?

面试官:线程池的核心参数有哪些?

面试官:如何确定核心线程池呢?

面试官:线程池的执行原理知道吗?

面试官:为什么不建议使用Executors创建线程池呢?


6.3 线程池

面试官:线程池的种类有哪些?

候选人

嗯!是这样

在jdk中默认提供了4中方式创建线程池

第一个是:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回 收空闲线程,若无可回收,则新建线程。

第二个是:newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列 中等待。

第三个是:newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

第四个是:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任 务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

面试官:线程池的核心参数有哪些?

候选人

在线程池中一共有7个核心参数:

  1. corePoolSize 核心线程数目 - 池中会保留的最多线程数

  2. maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目

  3. keepAliveTime 生存时间 - 救急线程的生存时间,生存时间内没有新任务,此线程资源会释放

  4. unit 时间单位 - 救急线程的生存时间单位,如秒、毫秒等

  5. workQueue - 当没有空闲核心线程时,新来任务会加入到此队列排队,队列满会创建救急线程执行任务

  6. threadFactory 线程工厂 - 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等

  7. handler 拒绝策略 - 当所有线程都在繁忙,workQueue 也放满时,会触发拒绝策略

在拒绝策略中又有4中拒绝策略

当线程数过多以后,第一种是抛异常、第二种是由调用者执行任务、第三是丢弃当前的任务,第四是丢弃最早排队任务。默认是直接抛异常。

面试官:如何确定核心线程池呢?

候选人

是这样的,我们公司当时有一些规范,为了减少线程上下文的切换,要根据当时部署的服务器的CPU核数来决定,我们规则是:CPU核数+1就是最终的核心线程数。

面试官:线程池的执行原理知道吗?

候选人

嗯~,它是这样的

首先判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队 列里。如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任 务。如果已经满了,则交给拒绝策略来处理这个任务。

面试官:为什么不建议使用Executors创建线程池呢?

候选人

好的,其实这个事情在阿里提供的最新开发手册《Java开发手册-嵩山版》中也提到了

主要原因是如果使用Executors创建线程池的话,它允许的请求队列默认长度是Integer.MAX_VALUE,这样的话,有可能导致堆积大量的请求,从而导致OOM(内存溢出)。

所以,我们一般推荐使用ThreadPoolExecutor来创建线程池,这样可以明确规定线程池的参数,避免资源的耗尽。



热门专栏推荐

计算机科学入门系列                     关注走一波

CSAPP深入理解计算机原理        关注走一波

微服务项目之黑马头条                 关注走一波

redis深度项目之黑马点评            关注走一波

Java面试八股文系列专栏            关注走一波

算法leetcode+剑指offer              关注走一波


总栏

​​​​​​JAVA后端技术栈                          关注走一波  

JAVA面试八股文​​​​​​                          关注走一波  

JAVA项目(含源码深度剖析)    关注走一波  

计算机四件套                               关注走一波  

算法                                        ​​​​​​     ​关注走一波  

必知必会工具集                           关注走一波

书籍网课笔记汇总                       关注走一波  

考试复习资料                              关注走一波  

C/C++技术栈                              关注走一波  

GO技术栈                                   关注走一波  


分栏

JAVA后端技术栈

spring                                      关注走一波         ​

redis                                        关注走一波

MySQL                               ​​​     关注走一波 

mybatis                        ​​​​     ​​​​      关注走一波

mybatisplus                           关注走一波

MQ                                          关注走一波

微服务                                     关注走一波

设计模式                                 关注走一波

分布式锁                                 关注走一波


JAVA八股文

JAVA面试八股文(redis、MySQL、框架、微服务、MQ、JVM、设计模式、并发编程、JAVA集合、常见技术场景)​​​​​​​​​​​​​​

                                                        关注走一波    

史上最强JAVA八股文(强烈推荐)            

                                                        关注走一波                                   


JAVA项目(含源码深度剖析)

黑马头条(微服务)             关注走一波

黑马点评(redis)               关注走一波


计算机四件套

计算机基础                           关注走一波

计算机基础                           关注走一波

计算机网络                           关注走一波

数据结构与算法                    关注走一波


算法

leetcode                              关注走一波

剑指offer                             关注走一波


必知必会工具集                   关注走一波


书籍网课笔记汇总

CSAPP笔记                        关注走一波

计算机科学速成课               关注走一波

CS自学指南                        关注走一波

读书笔记与每日记录           关注走一波


考试复习资料​​​​​​​                      关注走一波


C/C++技术栈                      关注走一波                           


GO技术栈                          关注走一波                                                    


非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞 关注❤收藏✅ 评论,大佬三连必回哦!thanks!!!
愿大家都能学有所得,功不唐捐!

你可能感兴趣的:(面试,#,线程,java,spring,开发语言)