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

栏目: IT技术 · 发布时间: 4年前

内容简介:2020年3月10日,星期二,广东深圳,天气晴~时间晚上6点04分~~烟哥正在愉快的撩妹!突然,只见手机微信一阵巨响,破坏了烟哥正在撩妹的好氛围!聊天记录如下图所示

引言

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

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

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

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

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

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

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

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

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

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

正文

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

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

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

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

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

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

用一张图来解释如下

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

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

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

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

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

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

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

其实答案就是 自定义队列

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

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

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

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

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

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

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

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

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

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

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

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

总结

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

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

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

本文卒!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Release It!

Release It!

Michael T. Nygard / Pragmatic Bookshelf / 2007-03-30 / USD 34.95

“Feature complete” is not the same as “production ready.” Whether it’s in Java, .NET, or Ruby on Rails, getting your application ready to ship is only half the battle. Did you design your system to......一起来看看 《Release It!》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具