博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池多任务的执行顺序
阅读量:4223 次
发布时间:2019-05-26

本文共 983 字,大约阅读时间需要 3 分钟。

线程池场景

面试官:“假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?”

粉丝豪:“应该是10吧。”

面试官:“你确定?”

粉丝豪:“确定啊,就是10…”

于是乎,粉丝豪就回去等通知了~

此题的陷阱,大家如果看出来了,本文就不用看了!

其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看!

正文

查看一下ThreadPoolExecutor的execute方法
在这里插入图片描述

解释

判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务
如果不小于corePoolSize,则将任务添加到workQueue队列
如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。
在这里插入图片描述
如图所示,默认的机制为线程池里的核心线程数不够了,后面进来的任务会先丢队列,当队列满了,才起新线程。
但是,有一种线程池机制的是这样的

先起线程,到最大值,再进队列

在dubbo中,有一种线程池叫EagerThreadPoolExecutor线程池。
在这里插入图片描述
它调的还是父类的execute方法,也还是ThreadPoolExecutor中的execute方法!

但是,它的队列!是一种自定义队列,叫TaskQueue,它的offer方法如下

在这里插入图片描述
这个offer方法的最核心的是红框中那步,当前线程数小于最大线程数时,则直接返回false。

ThreadPoolExecutor中的execute方法中的第二步的条件中,如果workQueue.offer返回为fasle,则直接进入第三步,创建新任务!如下图所示

在这里插入图片描述
EagerThreadPoolExecutor线程池通过自定义队列的这么一种形式,改写了线程池的机制。这种线程池的机制是核心线程数不够了,先起线程,当线程达到最大值后,后面的任务就丢进队列!
https://blog.csdn.net/Mr_25kjiang/article/details/105815054

你可能感兴趣的文章
如何使用log4j输出单个级别的log到指定文件
查看>>
表单元素与提示文字无法对齐的解决方法
查看>>
图片按钮消除边框
查看>>
windows xp 系统CMD命令大全
查看>>
xampp下Apache + Tomcat 集群配置的简单介绍(with sticky session)
查看>>
xampp(Apache + Tomcat)与主机的域名绑定
查看>>
增加windows下Tomcat运行时的内存
查看>>
tomcat群集中session共享的几个方案
查看>>
查找google谷歌北京IP地址的方法
查看>>
chrome的异常Uncaught ReferenceError: xl_chrome_menu is not defined
查看>>
Java不使用web容器,发布WebService应用
查看>>
Visual Studio 单元测试之三---压力测试
查看>>
Visual Studio 单元测试之五---数据库测试
查看>>
Visual Studio 单元测试之六---UI界面测试
查看>>
窗体间利用属性(property)来传递值时应注意的问题。
查看>>
动态代理技术的实现与理解
查看>>
使用Beyond Compare合并代码后出现乱码问题
查看>>
dmp数据文件导入问题
查看>>
使用Beyond Compare对比文件夹
查看>>
深入理解java虚拟机 -- jVM高级特性与最佳实践
查看>>