当前位置: 首页 > 后端技术 > Java

【Java专访】说说线程池中的线程回收

时间:2023-04-01 18:05:19 Java

大家好,我是Mic,一名工作14年的Java程序员。最近有很多朋友私信我,找我说说线程池相关的一些问题。线程池方向的研究点还是挺多的。如果面试官只要扫一扫面试题就能轻松识别出来,那我就简单举几个吧。线程池是如何实现线程回收的呢?核心线程可以回收吗?调用线程池的shutdown方法会发生什么?面试必须是一系列的问题来确定求职者对这个领域的了解程度。关于线程池回收相关的问题,我把专家部分的答案整理成了一个20W字的面试文档。可以私信我领取。来看看大师的回答大师:首先,线程池分为核心线程和非核心线程。核心线程是驻留在线程池中的工作线程,可以通过两种方式进行初始化。向线程池添加任务时,被动初始化在线程池中队列满时主动调用prestartAllCoreThreads方法,以增加线程池的任务处理能力。线程池增加非核心线程。核心线程和非核心线程的数量是在线程池构建时设置的,也可以动态改变。由于临时增加非核心线程解决的任务太多,当任务处理完成,工作线程空闲时,需要回收。因为所有工作线程都是从阻塞队列中获取要执行的任务,所以只要一定时间内阻塞队列中没有可以处理的任务,线程就可以结束。这个功能是通过阻塞队列中的poll方法来实现的。该方法提供两个参数:超时时间和超时时间单位。当超过指定时间仍未获得任务时,poll方法返回null,从而终止当前线程,完成线程回收。默认情况下,线程池只会回收非核心线程。如果要回收核心线程,可以将属性allowCoreThreadTimeOut设置为true。一般我们不会回收核心线程。因为线程池本身就是为了实现线程的复用,而这些核心线程在没有任务处理的时候是阻塞的,不占用CPU资源。总结关于线程池,是每个Java程序员都必须深入掌握的东西。很重要的一点,在我们的应用系统中,线程无处不在。包括在应用开发中,难免会用到线程池。掌握好它才能编写出更健壮和稳定的程序。请记得点赞、收藏、关注版权声明:本博客所有文章除特别注明外,均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!