前言

今天老吕给大家来分享下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相关推荐

  1. 线程池源码分析-FutureTask

    1 系列目录 线程池接口分析以及FutureTask设计实现 线程池源码分析-ThreadPoolExecutor 该系列打算从一个最简单的Executor执行器开始一步一步扩展到ThreadPool ...

  2. 吐血整理:Java线程池源码分析(基于JDK1.8建议收藏)

    文章目录 一.引言 二.线程池的参数介绍 1.ThreadPoolExecutor的UML图 三.线程池的使用 1.线程池的工作原理 2.线程池类型 2.1.newCachedThreadPool使用 ...

  3. Java线程池 源码分析

    1.个人总结及想法: (1)ThreadPoolExecutor的继承关系? ThreadPoolExecutor继承AbstractExectorService,AbstractExecutorSe ...

  4. java 线程池 源码_java线程池源码分析

    我们在关闭线程池的时候会使用shutdown()和shutdownNow(),那么问题来了: 这两个方法又什么区别呢? 他们背后的原理是什么呢? 线程池中线程超过了coresize后会怎么操作呢? 为 ...

  5. 线程池之ScheduledThreadPoolExecutor线程池源码分析笔记

    1.ScheduledThreadPoolExecutor 整体结构剖析. 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池 ...

  6. Zygote pre-fork线程池源码分析

    前言 在Android Q上,google为了加快应用的启动速度.在zygote fork阶段,采用了线程池的方式,来加快fork的过程. 首先,如果让我们自己做,肯定会选择java的线程池模型,先创 ...

  7. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  8. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

  9. 面试官系统精讲Java源码及大厂真题 - 38 线程池源码面试题

    38 线程池源码面试题 与有肝胆人共事,从无字句处读书. --周恩来 引导语 线程池在日常面试中占比很大,主要是因为线程池内容涉及的知识点较广,比如涉及到队列.线程.锁等等,所以很多面试官喜欢把线程池 ...

最新文章

  1. 亚马逊云服务(AWS)云原生自研处理器首次落地中国区域!
  2. ES6解构赋值学习总结
  3. Rancher Labs赋能合作伙伴抢滩容器市场
  4. Spring AOP 切点(pointcut)表达式
  5. CodeForces - 364A Matrix(思维+数学)
  6. 网络安全实验报告 第一章
  7. MongoDB入门系列(二):Insert、Update、Delete、Drop
  8. NOIP2016DAY1题解
  9. 树莓派安装rtl8192eu无线网卡驱动
  10. UDS协议之诊断会话管理服务 0x10
  11. 谷歌Chrome紧急更新补丁0day漏洞
  12. python读取多张图片_Python批量导出多个PPT/PPTX文件中每个幻灯片为独立JPG图片
  13. 对于神经网络学习 Maxwell 方程的思考——泛化能力
  14. 充分利用微博加快社区发展
  15. 快递鸟智选物流API对接流程
  16. 【vue】To install them, you can run: npm install --save aws-sdk module
  17. RxJava2出现:Unable to create call adapter for io.reactivex.Flowable
  18. java class获取type_父类通过泛型获得子类Class类型 以及Type体系
  19. 事件相关电位(ERP)在临床心理学中的运用
  20. Javascript实现cuid唯一标识号

热门文章

  1. MQTT.fx客户端的安装及开始
  2. 图像处理反向投影原理
  3. ubuntu 18.04 Linux下osip2/eXosip2编译
  4. 玛拉工艺计算机科学博士申请,顾老师助力新鲜出炉马来西亚玛拉工艺大学博士一枚!...
  5. 看清原理 探究彻底清除木马的方法
  6. Echarts将Y轴数据放入图表内,显示数据范围
  7. 计算机上面的音乐,电脑上如何识别音乐
  8. 还在找骆驼(羊驼)专用PBMC分离试剂盒吗?
  9. “技术总监面试,凭啥不问你技术细节?”
  10. ERP服务器性能改善,ERP系统的性能优化及其实现