youyichannel

志于道,据于德,依于仁,游于艺!

0%

线程池 01

线程池的原理

ThreadPoolExecutor 执行 execute 方法分下面 4 种情况。

  • 如果当前运行的线程少于 corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁
  • 如果运行的线程等于或多于 corePoolSize,则将任务加入 BlockingQueue。
  • 如果无法将任务加入 BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执行这一步骤需要获取全局锁)
  • 如果创建新线程将使当前运行的线程超出 maximumPoolSize,任务将被拒绝,并调用 RejectedExecutionHandler.rejectedExecution()方法。

ThreadPoolExecutor 采取上述步骤的总体设计思路,是为了在执行 execute()方法时, 尽可能地避免获取全局锁(获取全局锁将会是一个严重的可伸缩瓶颈)。在 ThreadPoolExecutor完成预热之后(当前运行的线程数大于等于 corePoolSize),几乎所有的 execute()方法调用都是执行步骤 2,而步骤 2 不需要获取全局锁。