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

栏目: 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的线程池的写法。

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

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

本文卒!


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

查看所有标签

猜你喜欢:

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

编码

编码

[美] Charles Petzold / 左飞、薛佟佟 / 电子工业出版社 / 2010 / 55.00元

本书讲述的是计算机工作原理。作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。更重要的是,你会因此而获得对计算机工作原理较深刻的理解。这种理解不是抽象层面上的,而是具有一定深度的。一起来看看 《编码》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换