大家好,我是 Mic,一个工作了 14 年的 Java 程序员。
最近很多小伙伴私信我,让我说一些线程池相干的问题。
线程池这个方向考查的点还挺多的,如果只是靠刷面试题
面试官很容易就能辨认进去,我轻易举几个。
- 线程池是如何实现线程的回收的
- 外围线程是否可能回收
- 当调用线程池的 shutdown 办法,会产生什么?
面试肯定是连环问,从而确定求职者对这个畛域的了解水平。
对于线程池回收相干的问题,高手局部的答复我整顿到了一个 20W 字的面试文档外面大家能够私信我支付。
上面看看高手的答复
高手:
首先,线程池外面分为外围线程和非核心线程。
外围线程是常驻在线程池外面的工作线程,它有两种形式初始化。
- 向线程池外面增加工作的时候,被动初始化
- 被动调用
prestartAllCoreThreads
办法
当线程池外面的队列满了的状况下,为了减少线程池的工作解决能力。
线程池会减少非核心线程。
外围线程和非核心线程的数量,是在结构线程池的时候设置的,也能够动静进行更改。
因为非核心线程是为了解决工作过多的时候长期减少的,所以当工作解决实现后,工作线程处于闲暇状态的时候,就须要回收。
因为所有工作线程都是从阻塞队列中去获取要执行的工作,所以只有在肯定工夫内,阻塞队列没有任何能够解决的工作,那这个线程就能够完结了。
这个性能是通过阻塞队列外面的 poll 办法来实现的。这个办法提供了超时工夫和超时工夫单位这两个参数当超过指定工夫没有获取到工作的时候,poll 办法返回 null,从而终止以后线程实现线程回收。
默认状况下,线程池只会回收非核心线程,如果心愿外围线程也要回收,能够设置 allowCoreThreadTimeOut 这个属性为 true,个别状况下咱们不会去回收外围线程。
因为线程池自身就是实现线程的复用,而且这些外围线程在没有工作要解决的时候是处于阻塞状态并没有占用 CPU 资源。
总结
对于线程池,是每一个 Java 程序员必须要深度把握的内容。
它很重要,在咱们的利用零碎中,无处不在体现线程。
包含在利用开发中,也难免会用到线程池。
把握好它可能写出更加健壮性和稳定性的程序。
大家记得点赞、珍藏加关注
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!