大家好,我是Mic,一个工作了14年的Java程序员。
最近很多小伙伴私信我,让我说一些线程池相关的问题。
线程池这个方向考察的点还挺多的,如果只是靠刷面试题
面试官很容易就能识别出来,我随便举几个。
- 线程池是如何实现线程的回收的
- 核心线程是否能够回收
- 当调用线程池的shutdown方法,会发生什么?
面试一定是连环问,从而确定求职者对这个领域的理解程度。
关于线程池回收相关的问题,高手部分的回答我整理到了一个20W字的面试文档里面大家可以私信我领取。
下面看看高手的回答
高手:
首先,线程池里面分为核心线程和非核心线程。
核心线程是常驻在线程池里面的工作线程,它有两种方式初始化。
- 向线程池里面添加任务的时候,被动初始化
- 主动调用prestartAllCoreThreads方法
当线程池里面的队列满了的情况下,为了增加线程池的任务处理能力。
线程池会增加非核心线程。
核心线程和非核心线程的数量,是在构造线程池的时候设置的,也可以动态进行更改。
由于非核心线程是为了解决任务过多的时候临时增加的,所以当任务处理完成后,工作线程处于空闲状态的时候,就需要回收。
因为所有工作线程都是从阻塞队列中去获取要执行的任务,所以只要在一定时间内,阻塞队列没有任何可以处理的任务,那这个线程就可以结束了。
这个功能是通过阻塞队列里面的poll方法来完成的。这个方法提供了超时时间和超时时间单位这两个参数当超过指定时间没有获取到任务的时候,poll方法返回null,从而终止当前线程完成线程回收。
默认情况下,线程池只会回收非核心线程,如果希望核心线程也要回收,可以设置allowCoreThreadTimeOut这个属性为true,一般情况下我们不会去回收核心线程。
因为线程池本身就是实现线程的复用,而且这些核心线程在没有任务要处理的时候是处于阻塞状态并没有占用CPU资源。
总结
关于线程池,是每一个Java程序员必须要深度掌握的内容。
它很重要,在我们的应用系统中,无处不在体现线程。
包括在应用开发中,也难免会用到线程池。
掌握好它能够写出更加健壮性和稳定性的程序。
大家记得点赞、收藏加关注
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构! 如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!