为什么核心线程池满了后,不直接创建新的线程去执行新任务?
Last updated on February 20, 2025 pm
写在前面
我们都知道线程池工作流程是先创建核心线程,核心线程满了之后将任务放入阻塞队列,阻塞队列满了之后才会创建非核心线程,直到线程数达到最大线程数了,才去采取相应的拒绝策略处理新来的任务。流程如下图所示:
问题
本以为对线程池这块已经没有什么疑问了,直到面试被问到为什么是先放阻塞队列,而不是先创建非核心线程?
看了些回答,大致原因如下,总结下做个记忆:
- 核心线程执行完当前的任务之后,会从工作队列中取任务执行,如果不先放进工作队列的话,会导致核心线程处于空闲状态。
- 线程池创建线程需要获取mainlock这个全局锁,会影响并发效率,所以使用阻塞队列把第一步创建核心线程与第三步创建最大线程隔离开来,起一个缓冲的作用。
- 非核心线程空闲一段时间会被销毁,这样设计可以减少线程的频繁创建和销毁。
为什么核心线程池满了后,不直接创建新的线程去执行新任务?
http://example.com/2025/02/20/为什么核心线程池满了后,不直接创建新的线程去执行新任务?/