线程池的原理
ThreadPoolExecutor
执行 execute
方法分下面
4 种情况。
- 如果当前运行的线程少于
corePoolSize
,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁) - 如果运行的线程等于或多于
corePoolSize
,则将任务加入 BlockingQueue。 - 如果无法将任务加入 BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执行这一步骤需要获取全局锁)
- 如果创建新线程将使当前运行的线程超出
maximumPoolSize
,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()
方法。
ThreadPoolExecutor
采取上述步骤的总体设计思路,是为了在执行 execute()
方法时,
尽可能地避免获取全局锁(获取全局锁将会是一个严重的可伸缩瓶颈)。在
ThreadPoolExecutor
完成预热之后(当前运行的线程数大于等于
corePoolSize),几乎所有的 execute()
方法调用都是执行步骤
2,而步骤 2 不需要获取全局锁。