内容简介: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的线程池的写法。
毕竟我后来男性友人的答复是:
本文卒!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 045.Python线程队列
- Callable,阻塞队列,线程池问题
- 数据结构与算法:队列:队列在线程池等有限资源池中的应用
- 任务与队列 iOS之多线程GCD(一)
- 踩坑 Spring Cloud Hystrix 线程池队列配置
- c# – 使用线程处理队列的最有效的方式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Tomcat架构解析
刘光瑞 / 人民邮电出版社 / 2017-5 / 79.00元
本书全面介绍了Tomcat的架构、各组件的实现方案以及使用方式。包括Tomcat的基础组件架构以及工作原理,Tomcat各组件的实现方案、使用方式以及详细配置说明,Tomcat与Web服务器集成以及性能优化,Tomcat部分扩展特性介绍等。读者可以了解应用服务器的架构以及工作原理,学习Tomcat的使用、优化以及详细配置。一起来看看 《Tomcat架构解析》 这本书的介绍吧!