Java线程池提交一个任务,在未达到核心线程数之前,为何不复用之前创建的线程,而是直接新建?
面试官提了个这样的问题,我蒙了。搞不懂这题的考点(知识点)是什么?求助各位大佬。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
面试官提了个这样的问题,我蒙了。搞不懂这题的考点(知识点)是什么?求助各位大佬。。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
@代码宇宙 提到的
预热
是一方面,另外复用之前创建的线程
本身是有锁开销的,而核心线程数应该是你根据实际情况配置好的一个最优值,在到达这个最优值前尽量避免用锁,有助于提升性能。我的理解是这种策略主要是为了
预热
。也就是即使刚开始还没有很多任务到来,但是我先创建好一批线程,以备不时之需。我也觉得是类似
预热
的意思。线程池在核心线程池内线程数未达到设定最大值时,可以视为这个线程池并未完全初始化完成。这个线程池的设计者应该是考虑过是否需要在线程池被创建出来时就将所有核心线程全部创建出来,但是考虑到如果给定的核心线程数太多,全部初始化的开销太大,程序可能会卡在这一步好久。于是想出了这个解决方案:当核心线程池中线程个数未达到上限时,每当来一个任务时,再去创建一个新线程并且执行这个任务,直到到达上限。此时,线程池才能算是真正初始化完毕。
这样的好处应该是,把创建线程的开销平均到刚开始的每次执行任务中去,这样对系统的性能影响可以降低到最小。