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

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

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

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

本文卒!


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

查看所有标签

猜你喜欢:

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

Tomcat架构解析

Tomcat架构解析

刘光瑞 / 人民邮电出版社 / 2017-5 / 79.00元

本书全面介绍了Tomcat的架构、各组件的实现方案以及使用方式。包括Tomcat的基础组件架构以及工作原理,Tomcat各组件的实现方案、使用方式以及详细配置说明,Tomcat与Web服务器集成以及性能优化,Tomcat部分扩展特性介绍等。读者可以了解应用服务器的架构以及工作原理,学习Tomcat的使用、优化以及详细配置。一起来看看 《Tomcat架构解析》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具