面试官:这道线程池场景题先简单的回答一下

155 阅读3分钟

引言

一道面试题开始~~面试官:"假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?"粉丝豪:"应该是10吧。"面试官:"你确定?"粉丝豪:"确定啊,就是10…"于是乎,就回去等通知了~

此题的陷阱,大家如果看出来了,本文就不用看了!其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看!

ps:不要纠结这题是不是咬文嚼字,现在人多如米,题目就是这样坑~

正文

先进队列,到最大值,再起线程

这种情况是大家最容易想到的情况,因为JDK中的线程池,也就是ThreadPoolExecutor就是这种机制的!

OK,我们先来看一下ThreadPoolExecutor的execute方法,如下图所示

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/101ee17c0bad4fc7897aaafede4d1d7d~tplv-k3u1fbpfcp-zoom-1.image)

看到三个红框了吧(其实源码里有解释),对应的三步分别是

  • (1)判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务
  • (2)如果不小于corePoolSize,则将任务添加到workQueue队列
  • (3)如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。

用一张图来解释如下

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d1a7b03e88664116927691f915da18b7~tplv-k3u1fbpfcp-zoom-1.image)

如图所示,默认的机制为线程池里的核心线程数不够了,后面进来的任务会先丢队列,当队列满了,才起新线程。

因此,按照这套机制!粉丝豪的回答是正确的,当有100个任务添加进来时,剩下先起10个核心线程,剩下90个任务都丢进队列里,因此线程池里只有10个线程在执行!

但是,有一种线程池机制的是这样的

先起线程,到最大值,再进队列

不知道大家有没听过在dubbo中,有一种线程池叫EagerThreadPoolExecutor线程池。该线程池的execute方法如下所示

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0d2207a20dae4c74bb9632d186fa16ee~tplv-k3u1fbpfcp-zoom-1.image)

它调的还是父类的execute方法,也还是ThreadPoolExecutor中的execute方法!
但是,它的队列!是一种自定义队列,叫TaskQueue,它的offer方法如下

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0383eb1fe68447a2aaa7c86b084acd7e~tplv-k3u1fbpfcp-zoom-1.image)

这个offer方法的最核心的是红框中那步,当前线程数小于最大线程数时,则直接返回false。

ThreadPoolExecutor中的execute方法中的第二步的条件中,如果workQueue.offer返回为fasle,则直接进入第三步,创建新任务!如下图所示

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4ecc30f9e4c941598275959672833722~tplv-k3u1fbpfcp-zoom-1.image)

EagerThreadPoolExecutor线程池通过自定义队列的这么一种形式,改写了线程池的机制。这种线程池的机制是核心线程数不够了,先起线程,当线程达到最大值后,后面的任务就丢进队列!

因此,如果按照这么一套机制,粉丝豪的答案就不正确了。当100个任务添加进来时,直接会起20个线程,剩下80个任务都丢进队列!

接下来是小编通过一些大厂的朋友要到了他们内部的Java面试题,资料难得,而且还是近一年的真实面试题;

分别有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/809fc69c530f433aaf5d4b6f5281a05e~tplv-k3u1fbpfcp-zoom-1.image)

这些年还专门整理针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题,覆盖面也非常的广泛,也有超详细的答案;

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5a2e7fa0740645f3b0a8cdfc9cc5a396~tplv-k3u1fbpfcp-zoom-1.image)

小编网盘也通过这些年的积累,把Java电子书也分享给大家,大概有10G左右的资源

![面试官:这道线程池场景题先简单的回答一下](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/78a215728cb5432fbaefa5e4ecefe102~tplv-k3u1fbpfcp-zoom-1.image)