线程池源码分析之ThreadPoolExecutor
前言
今天老吕给大家来分享下ThreadPoolExecutor 线程池的实现逻辑,大家伙认真看,一般人我不告诉他的。
线程池相关类图
JDK中线程池相关的类结构关系图
获取不同特性的线程池
在Executors中可以获取到如下类型的线程池:
//下面这几种线程池的实现基础都是ThreadPoolExecutor 线程池实现类
static ExecutorService executorService1 = Executors.newFixedThreadPool(10);
static ExecutorService executorService2 = Executors.newCachedThreadPool();
static ExecutorService executorService3 = Executors.newSingleThreadExecutor();
static ExecutorService executorService4 = Executors.newScheduledThreadPool(10);
static ExecutorService executorService5 = Executors.newSingleThreadScheduledExecutor();
//它的实现比较特殊用的ForkJoinPool 线程池实现类
static ExecutorService executorService6 = Executors.newWorkStealingPool();
ThreadPoolExecutor的实现逻辑
上面6种类型的线程池,大部分是以ThreadPoolExecutor为基础来实现的,我们今天只分析 ThreadPoolExecutor的实现逻辑。
首先看下著名的7大参数
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
这是我总结的7大参数的含义,很简单是吧
下面看下线程池线程数量扩张与任务队列的关系,仔细体会
在源码中Worker本质上就是一个Thread,只有第一个任务(firstTask)是通过构造函数传进去的,之后执行的任务都是通过任务队列获取,从而也可以看出任务的本质是实现了Runnable接口的消息而已。
最后总结下这个线程池的实现逻辑
1、一个任务过来后,除了 新增一个线程时会将任务直接送到新线程里面
2、其它情况下所有的任务都是先放入任务队列
3、线程池中的所有线程一视同仁都是从任务队列中获取任务
4、假如你的最大线程个数为100,任务队列容量为很小,比如:容量为10,在并发较高场景下就会出现 池中线程 空闲线程很多,但是客户端收到 拒绝执行的奇怪现象。如果你理解了前3点,这个现象的原因你也就知道了。
5、谢谢大家,今天就到这里,有疑问加作者微信,进群探讨。
线程池源码分析之ThreadPoolExecutor相关推荐
- 线程池源码分析-FutureTask
1 系列目录 线程池接口分析以及FutureTask设计实现 线程池源码分析-ThreadPoolExecutor 该系列打算从一个最简单的Executor执行器开始一步一步扩展到ThreadPool ...
- 吐血整理:Java线程池源码分析(基于JDK1.8建议收藏)
文章目录 一.引言 二.线程池的参数介绍 1.ThreadPoolExecutor的UML图 三.线程池的使用 1.线程池的工作原理 2.线程池类型 2.1.newCachedThreadPool使用 ...
- Java线程池 源码分析
1.个人总结及想法: (1)ThreadPoolExecutor的继承关系? ThreadPoolExecutor继承AbstractExectorService,AbstractExecutorSe ...
- java 线程池 源码_java线程池源码分析
我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...
- 线程池之ScheduledThreadPoolExecutor线程池源码分析笔记
1.ScheduledThreadPoolExecutor 整体结构剖析. 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池 ...
- Zygote pre-fork线程池源码分析
前言 在Android Q上,google为了加快应用的启动速度.在zygote fork阶段,采用了线程池的方式,来加快fork的过程. 首先,如果让我们自己做,肯定会选择java的线程池模型,先创 ...
- java线程池_Java 并发编程 线程池源码实战
作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...
- Java 并发编程 -- 线程池源码实战
一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...
- 面试官系统精讲Java源码及大厂真题 - 38 线程池源码面试题
38 线程池源码面试题 与有肝胆人共事,从无字句处读书. --周恩来 引导语 线程池在日常面试中占比很大,主要是因为线程池内容涉及的知识点较广,比如涉及到队列.线程.锁等等,所以很多面试官喜欢把线程池 ...
最新文章
- 亚马逊云服务(AWS)云原生自研处理器首次落地中国区域!
- ES6解构赋值学习总结
- Rancher Labs赋能合作伙伴抢滩容器市场
- Spring AOP 切点(pointcut)表达式
- CodeForces - 364A Matrix(思维+数学)
- 网络安全实验报告 第一章
- MongoDB入门系列(二):Insert、Update、Delete、Drop
- NOIP2016DAY1题解
- 树莓派安装rtl8192eu无线网卡驱动
- UDS协议之诊断会话管理服务 0x10
- 谷歌Chrome紧急更新补丁0day漏洞
- python读取多张图片_Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片
- 对于神经网络学习 Maxwell 方程的思考——泛化能力
- 充分利用微博加快社区发展
- 快递鸟智选物流API对接流程
- 【vue】To install them, you can run: npm install --save aws-sdk module
- RxJava2出现:Unable to create call adapter for io.reactivex.Flowable
- java class获取type_父类通过泛型获得子类Class类型 以及Type体系
- 事件相关电位(ERP)在临床心理学中的运用
- Javascript实现cuid唯一标识号
热门文章
- MQTT.fx客户端的安装及开始
- 图像处理反向投影原理
- ubuntu 18.04 Linux下osip2/eXosip2编译
- 玛拉工艺计算机科学博士申请,顾老师助力新鲜出炉马来西亚玛拉工艺大学博士一枚!...
- 看清原理 探究彻底清除木马的方法
- Echarts将Y轴数据放入图表内,显示数据范围
- 计算机上面的音乐,电脑上如何识别音乐
- 还在找骆驼(羊驼)专用PBMC分离试剂盒吗?
- “技术总监面试,凭啥不问你技术细节?”
- ERP服务器性能改善,ERP系统的性能优化及其实现