任务execute过程
流程图
示意图
ThreadPoolExecutor执行execute():
- 若当前运行的线程少于
corePoolSize,则创建新线程来执行任务(该步需要获取全局锁) - 若运行的线程多于或等于
corePoolSize,且工作队列没满,则将新提交的任务存储在工作队列里。即,将任务加入BlockingQueue - 若无法将任务加入
BlockingQueue,且没达到线程池最大数量,则创建新的线程来处理任务(该步需要获取全局锁) - 若创建新线程将使当前运行的线程超出
maximumPoolSize,任务将被拒绝,并调用RejectedExecutionHandler.rejectedExecution()
采取上述思路,是为了在执行execute()时,尽可能避免获取全局锁。在ThreadPoolExecutor完成预热后(当前运行的线程数≥corePoolSize),几乎所有的execute()方法调用都是执行步骤2,而步骤2不需要获取全局锁。
实例
结果



