面试官:这道线程池场景题回答一下?
(给ImportNew加星标,提高Java技能)
https://mp.weixin.qq.com/s/sRfLCpn6VRF6760DFDxyDQ
引言
面试官:"假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?"
粉丝豪:"应该是10吧。"
面试官:"你确定?"
粉丝豪:"确定啊,就是10…"
于是乎,粉丝豪就回去等通知了~
其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看!
正文
先进队列,到最大值,再起线程
看到三个红框了吧(其实源码里有解释),对应的三步分别是
(1)判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务
-
(2)如果不小于corePoolSize,则将任务添加到workQueue队列
-
(3)如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。
先起线程,到最大值,再进队列
该线程池的execute方法如下所示
但是,它的队列!是一种自定义队列,叫TaskQueue,它的offer方法如下
发散题
总结
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
好文章,我在看❤️