Java线程池提交一个任务,在未达到核心线程数之前,为何不复用之前创建的线程,而是直接新建?

面试官提了个这样的问题,我蒙了。搞不懂这题的考点(知识点)是什么?求助各位大佬。。

阅读 4.8k
3 个回答

@代码宇宙 提到的 预热 是一方面,另外 复用之前创建的线程 本身是有锁开销的,而核心线程数应该是你根据实际情况配置好的一个最优值,在到达这个最优值前尽量避免用锁,有助于提升性能。

我的理解是这种策略主要是为了预热。也就是即使刚开始还没有很多任务到来,但是我先创建好一批线程,以备不时之需。

我也觉得是类似预热的意思。
线程池在核心线程池内线程数未达到设定最大值时,可以视为这个线程池并未完全初始化完成。这个线程池的设计者应该是考虑过是否需要在线程池被创建出来时就将所有核心线程全部创建出来,但是考虑到如果给定的核心线程数太多,全部初始化的开销太大,程序可能会卡在这一步好久。于是想出了这个解决方案:当核心线程池中线程个数未达到上限时,每当来一个任务时,再去创建一个新线程并且执行这个任务,直到到达上限。此时,线程池才能算是真正初始化完毕。
这样的好处应该是,把创建线程的开销平均到刚开始的每次执行任务中去,这样对系统的性能影响可以降低到最小。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏