首页
学习
活动
专区
圈层
工具
发布

线程池ThreadPoolExecutor源码分析

,本篇咱们就来深入分析线程池的实现类ThreadPoolExecutor。...对照流程图,我们再来看源码: //ctl中存放的是int值,int值得高低位保存了线程池运行的状态和有效线程的数量 private final AtomicInteger ctl = new AtomicInteger...workerStarted) addWorkerFailed(w); } return workerStarted; } 5、shutdown方法 线程池不用了,要关闭线程池,下面是源码: public...tryTerminate(); } 结束语 本篇详细的分析了ThreadPoolExecutor的execute方法,耗费了不少时间。...云服务器,云硬盘,数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF)

59420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ThreadPoolExecutor 线程池源码分析

    private static final int CAPACITY = (1 << COUNT_BITS) - 1; 不得不佩服写 JDK 源码这些大佬,把一个变量用的这么好,ctl 变量通过位运算同时表达了线程池状态和线程个数...static int ctlOf(int rs, int wc) { return rs | wc; } 在源码中经常看到这些方法,是不是用的很巧妙?...然后再次执行任务)、DiscardPolicy(直接抛弃任务) keepAliveTime:存活时间,当线程个数大于了核心线程数,且处于空闲状态,这些空闲线程可存活的最大时间 源码拆解...因为 Woker 的构造器是通过线程工厂创建的线程,分析如下 Worker(Runnable firstTask) { setState(-1); // inhibit interrupts until...w); } finally { mainLock.unlock(); } // 尝试把线程池的状态设置为 TERMINATED,该方法在后面分析 tryTerminate

    69430

    Java线程池ThreadPoolExecutor源码分析

    Java线程池ThreadPoolExecutor源码分析 Executor接口 public interface Executor { void execute(Runnable command...线程池监控 如果在系统中大量使用线程池,则有必要对线程池进行监控,方便在出现问题时,可以根据线程池的使用状况快速定位问题。 可以通过线程池提供的参数进行监控,在监控线程池的时候可以使用以下属性。...largestPoolSize:线程池里曾经创建过的最大线程数量。通过这个数据可以知道线程池是否曾经满过。如该数值等于线程池的最大大小, 则表示线程池曾经满过。...getPoolSize:线程池的线程数量。如果线程池不销毁的话,线程池里的线程不会自动销毁,所以这个大小只增不减。 getActiveCount:获取活动的线程数。 通过扩展线程池进行监控。...可以通过继承线程池来自定义线程池,重写线程池的beforeExecute、afterExecute和terminated方法, 也可以在任务执行前、执行后和线程池关闭前执行一些代码来进行监控。

    71530

    JUC线程池ThreadPoolExecutor源码分析

    前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。...工作线程,内部类Worker类型,是线程池中真正的工作线程对象。 关于AQS笔者之前写过一篇相关源码分析的文章:JUC同步器框架AbstractQueuedSynchronizer源码图文分析。...源码分析 先分析线程池的关键属性,接着分析其状态控制,最后重点分析ThreadPoolExecutor#execute()方法。...execute方法源码分析 线程池异步执行任务的方法实现是ThreadPoolExecutor#execute(),源码如下: // 执行命令,其中命令(下面称任务)对象是Runnable的实例 public...,后面将会编写两篇文章分别详细分析线程池扩展服务ExecutorService的功能源码实现以及调度线程池ScheduledThreadPoolExecutor的源码实现,预计要耗时2-3周。

    1.4K40

    源码分析Dubbo线程池实现原理

    微信公众号:[中间件兴趣圈] 作者简介:《RocketMQ技术内幕》作者 本文主要分析Dubbo线程池的构建过程,主要介绍官方文档中有关于ThreadPool的种类: fixed 固定大小线程池,启动时建立线程...(缺省) cached 缓存线程池,空闲一分钟,线程会消费,需要时重新创建新线程。 limited 可伸缩线程池,但池中的线程数只会增长不会收缩。 eager 优先使用线程来执行新提交任务。...更多有关线程池,请参考作者的另外一篇博文:https://blog.csdn.net/prestigeding/article/details/53929713 解析来我们将一一分析Dubbo支持的线程池类型...fixed 固定大小线程池。...2、要实现fixed固定大小线程池,故名思议,就是线程池自创建以来,线程数量始终保持一致。

    2.5K20

    Java线程池实现原理和源码分析

    Java线程池实现原理和源码分析 ? 前言 本文章是从2019年11月下旬开始打开写的,一直拖到2020年的年尾才开始写,直到2021年年初才写完。 时间太快也太慢~!...JDK1.8的源码来分析Java线程池的核心设计与实现。 本文参考了Java线程池实现原理及其在美团业务中的实践这篇文章中的部分内容。...Java线程池实现原理及其在美团业务中的实践这篇文章写的非常好,除过本文内容之外这篇文章还讲述了的关于线程池的背景,线程池在业务中的实践和动态化线程池等,所以想了解线程池关于这些类容的可以阅读Java线程池实现原理及其在美团业务中的实践这篇文章...任务调度流程图.png 接下来进入源代码分析时间~!...interruptIdleWorkers 方法在动态调整线程池大小部分有源码讲述,它只会中断空闲的线程,不会中断正在执行任务的的线程。空闲的线程将会阻塞在线程池的阻塞队列上。

    71820

    JUC并发—11.线程池源码分析

    大纲1.线程池的优势和JUC提供的线程池2.ThreadPoolExecutor和Excutors创建的线程池3.如何设计一个线程池4.ThreadPoolExecutor线程池的执行流程5.ThreadPoolExecutor...的源码分析6.如何合理设置线程池参数 + 定制线程池1.线程池的优势和JUC提供的线程池(1)为什么使用线程池(2)线程池的优势(3)JUC提供的线程池(1)为什么使用线程池线程的创建涉及内存分配、CPU...5.ThreadPoolExecutor的源码分析(1)线程池的成员变量(2)线程池状态和线程数量的存储(3)线程池的状态机及变更(4)线程池的execute()方法(5)线程池的addWorker()...方法(6)线程池的工作线程Worker(7)线程池的runWorker()方法(8)线程池的getTask()方法(9)线程池的processWorkerExit()方法(10)线程池的拒绝策略(1)线程池的成员变量...)线程池的核心参数(2)如何设置线程池的大小(3)如何动态设置线程池参数(4)定制线程池的注意事项(1)线程池的核心参数构建线程池时的核心参数其实就是线程数量和队列类型及长度:corePoolSize、

    25100

    nginx1.17.9源码分析之线程池

    我们发现事件驱动的软件都得配一个线程池。libuv和nginx都是。因为事件驱动的软件是单线程。但是有些事情总会引起线程阻塞。所以这个事情就不能放到主线程里做。这就是为什么事件驱动都要配一个线程池。...把任务交给线程池中的线程。主线程继续执行。任务完成后通知主线程或者执行回调就行。 我们先看一下nginx线程池的架构。然后开始分析。 ?...在这里插入图片描述 线程池模块在nginx里属于核心模块。在nginx初始化的时候。会初始化一个保存线程池配置的结构体(见图)。nginx默认开启四个线程池。...在分析解析指令前,我们先看一下几个工具函数。...接下就是创建线程和初始化线程池的数据了。在每个worker初始化的时候,会根据线程池的配置,创建对应的线程。

    86410

    Java线程池实现原理和源码分析

    Java线程池实现原理和源码分析 [dc61b582844cf193af46b8f90f480960.png#pic_center] 前言 本文章是从2019年11月下旬开始打开写的,一直拖到2020年的年尾才开始写...JDK1.8的源码来分析Java线程池的核心设计与实现。 本文参考了Java线程池实现原理及其在美团业务中的实践这篇文章中的部分内容。...Java线程池实现原理及其在美团业务中的实践这篇文章写的非常好,除过本文内容之外这篇文章还讲述了的关于线程池的背景,线程池在业务中的实践和动态化线程池等,所以想了解线程池关于这些类容的可以阅读Java线程池实现原理及其在美团业务中的实践这篇文章...[任务调度流程图.png] 接下来进入源代码分析时间~!...interruptIdleWorkers 方法在动态调整线程池大小部分有源码讲述,它只会中断空闲的线程,不会中断正在执行任务的的线程。空闲的线程将会阻塞在线程池的阻塞队列上。

    75000

    线程池源码研究

    前言:第一次写源码分析类文章,有点忐忑,还是硬着头皮上了。 之前几篇线程池文章主要是讲解线程池使用场景,这篇文章我以非代码方式讲解源码,这个估计没人这么干过吧!哈哈。...下面,从3点说明线程池工作原理 线程池的接口定义和继承关系 线程池中线程的状态描述 线程池工作细节 因为不能粘贴源码,我会用思维导图的形式把上面几个点串起来。...上面的思维导图,我们再看右边的部分,创建线程池源码中出现两种不一样的构造方法。...3、线程池工作细节 最后,我们看下线程池工作细节,其实就是分析work线程新增和对各种状态如何做处理。首先我们给自己提几个问题,这样分析比较有针对性。...参考 [Java未开源的Unsafe类]https://www.cnblogs.com/daxin/p/3366606.html [线程池之ThreadPoolExecutor线程池源码分析笔记]https

    58400

    线程池分析

    线程使用上的问题new Thread().start();线程的频繁创建和销毁线程的数量过多,会造成CPU资源的开销。上下文切换 (消耗CPU资源)池化技术连接池、对象池、内存池、线程池 。。。...池化技术的核心: 复用线程池的设计思考需求: 实现线程的重复使用.让线程重复使用的唯一方法,就是使线程不结束通过阻塞队列,实现线程复用线程池的实现原理分析线程池实现只需要一个阻塞队列就可以实现,当线程去阻塞队列拿任务的时候...线程池添加任务的原理图片线程池如何设置合理的线程数量IO密集型 CPU 2core+1CPU密集型 CPU +1七个参数解析从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、...二、maximumPoolSize 线程池最大线程数量当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。...如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

    39420

    【多线程】线程池源码(3)

    线程池的源码解读就先告一段落了(其实总感觉缺了什么东西,但是又找不到),本篇文章就简单总结下之前讲的流程及一些用法。...可以看到有前后置执行策略,也有拒绝策略,以及线程池的相关状态等,接下来通过截图仔细看一下 ? 至于线程池的状态如下 ?...这里再说下,task数 = 队列的长度 + 最大线程数 原因的话如果前面有仔细阅读源码解析应该是知道的,这里再说一下 「队列的长度」 ,看execute中的代码 ?...结语 java多线程中的线程池到这就告一段落啦,这些理论只是相对简单的,线程池的复杂是涉及到操作系统底层的了,是基本不可能预测到操作系统是要运行哪个线程的,写这些理论知识是在我们可控的层面尽可能多地去理解它...用下面这张图来做个总结叭,「你理想的线程池 vs 真正的线程池」 ? 图片来自网络,侵删

    52020

    【多线程】线程池源码(1)

    上一篇文章讲了有关线程池的一些简单的用法,这篇文章主要是从源码的角度进一步带大家了解线程池的工作流程和工作原理。...遇到「新的任务」后 如果工作线程数 线程数,那么直接加1个worker 如果线程池是正常的工作状态,并且工作队列能够添加任务,此时需要第二轮判断 如果线程池因为某种原因不正常了,并且能够成功从工作队列中删除任务...源码里的注释如下 ? 来看看代码具体是如何的 ? 一进来就是一个死循环,这个死循环最主要的目的是「确认线程池状态是否正常」。...如果线程池的状态大于SHUTDOWN,也就是处于STOP、TIDYING或者TERMINATED的时候,线程池都没了,还创建worker干啥,直接返回fasle;当线程池处于SHUTDOWN的时候,又得再次判断...如果增加工作线程失败,那就是其它线程增加了该数量,如果此时线程池的「运行状态发生了改变」,则重复外层循环,否则就「自旋直到成功增加工作线程数。」

    49230

    java线程池(七):ForkJoinPool源码分析之三(ForkJoinTask源码)

    1.类结构及其成员变量 1.1 类结构和注释 类前面的注释部分如下: ForkJoinTask是在ForkJoinPool中运行task的基础抽象类,ForkJoinTask是类似于线程的实体,其权重比普通线程要轻得多...当所有任务都具有这种形式的时候,请考虑使用asyncMode 中构造的池。...或者调用isDone,否则,执行该任务的状态或执行该操作的任何数据的后续修改不一定可由执行该任务的线程以外的任何线程一致地观察到。...,如果为工作线程,则将任务添加到其工作队列。...另外,任何ForkJoinPool中的某个线程在其池变为isQuiescent时都会调用helpExpungeStaleExceptions static final class ExceptionNode

    1.4K30
    领券