8

面试官:线程池运行机制如何改为线程池满了,再丢队列?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIwMDgzMjc3NA%3D%3D&%3Bmid=2247484803&%3Bidx=1&%3Bsn=09cff97b393e16e776626ca39603ea48
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引言

2020年3月10日,星期二,广东深圳,天气晴~

时间晚上6点04分~~烟哥正在愉快的撩妹!

突然,只见手机微信一阵巨响,破坏了烟哥正在撩妹的好氛围!聊天记录如下图所示

QJR3Irb.jpg!web

本来呢,烟哥是不想理的。毕竟每天日理万机,总不可能每个人都回复!

但是,这个男人不一样,他是我生命中 _ _ _ _ _ _ 的男人!

A、最重要的    B、最有分量的    C、读者自己填吧

于是,我抛弃妹纸,果断回了一句话(就在图里)!

准备接下一句的时候,旁边的妹纸不乐意了,差点没把我手机砸了!因此,就造成了上面的聊天截图,聊了一半,我竟然消失了!

于是我内心有愧,就有了本文诞生!

正文

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

aYVzeab.jpg!web

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

  • (1)判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务

  • (2)如果不小于corePoolSize,则将任务添加到workQueue队列

  • (3)如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。

用一张图来解释如下

yErEnu3.png!web

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

那如何修改为当线程池里核心线程数不够了,后面进来当任务先起线程去执行,当线程池满了,再丢队列呢?

坦白说,我接到这个问题,第一反应是自己定一个线程池继承ThreadPoolExecutor,然后改写execute方法,像下面这样

public class MyThreadPoolExecutor extends ThreadPoolExecutor {
    @Override
    public void execute(Runnable command) {
        //改if的顺序
    }
}

但是我感觉这问题隐隐没这么简单! 一定有一个玄机是我没想到的!

于是我同粉丝何和粉丝雄进行了一番shen入交流,终于他们屈服于我的威严之下,给了一个我比较认可的答案~

其实答案就是 自定义队列

再回到ThreadPoolExecutor的execute方法,如下图所示

rqqIbaa.jpg!web

第一步应该知道了,判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务!

第二步的条件中,如果 workQueue.offer 返回为fasle,则直接进入第三步,创建新任务!

那具体这个offer方法怎么改呢?还好Dubbo里已经给我了我们现成的实现!

Dubbo里有一个队列叫 TaskQueue ,该队列继承了 LinkedBlockingQueue ,它的offer方法如下

2eyEZzJ.png!web

图中的 getSubmittedTaskCount() 表示正在执行任务数,其实就是用一个原子类,执行execute方法的开始加1,结束减一。

而它的 EagerThreadPoolExecutor 线程池使用的就是该队列,该队列的execute方法看一下就懂了

VNZzAjZ.jpg!web

好的,我知道你们还是不大懂。仔细对着那两张图,仔细想想就知道了!

另外,有空仔细翻一下Dubbo这两个类的源码!

总结

说实在话,烟哥感觉此题答案漂浮不定。但是我猜,应该是为了考察后面dubbo的线程池的写法。

毕竟我后来男性友人的答复是:

3eIVv2y.jpg!web

本文卒!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK