引言
一道面试题开始~~面试官:"假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?"粉丝豪:"应该是10吧。"面试官:"你确定?"粉丝豪:"确定啊,就是10…"于是乎,粉丝豪就回去等通知了~
此题的陷阱,大家如果看出来了,本文就不用看了!其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看!
ps:不要纠结这题是不是咬文嚼字,现在人多如米,题目就是这样坑~
正文
先进队列,到最大值,再起线程
这种情况是大家最容易想到的情况,因为JDK中的线程池,也就是ThreadPoolExecutor就是这种机制的!
OK,我们先来看一下ThreadPoolExecutor的execute方法,如下图所示
看到三个红框了吧(其实源码里有解释),对应的三步分别是
- (1)判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务
- (2)如果不小于corePoolSize,则将任务添加到workQueue队列
- (3)如果放入workQueue失败,则创建线程执行任务,如果这时