首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java线程ThreadPoolExecutor源码分析

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

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

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

Java线程实现原理和源码分析 ? 前言 本文章是从2019年11月下旬开始打开写的,一直拖到2020年的年尾才开始写,直到2021年年初才写完。 时间太快也太慢~!...JDK1.8的源码分析Java线程的核心设计与实现。 本文参考了Java线程实现原理及其在美团业务中的实践这篇文章中的部分内容。...Java线程实现原理及其在美团业务中的实践这篇文章写的非常好,除过本文内容之外这篇文章还讲述了的关于线程的背景,线程在业务中的实践和动态化线程等,所以想了解线程关于这些类容的可以阅读Java线程实现原理及其在美团业务中的实践这篇文章...如果读者为做服务端开发的同学那么强烈建议阅读Java线程实现原理及其在美团业务中的实践。 外观 外观主要是我们平常使用线程的时候所看到的一些点。...interruptIdleWorkers 方法在动态调整线程大小部分有源码讲述,它只会中断空闲的线程,不会中断正在执行任务的的线程。空闲的线程将会阻塞在线程的阻塞队列上。

52220

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

Java线程实现原理和源码分析 [dc61b582844cf193af46b8f90f480960.png#pic_center] 前言 本文章是从2019年11月下旬开始打开写的,一直拖到2020年的年尾才开始写...JDK1.8的源码分析Java线程的核心设计与实现。 本文参考了Java线程实现原理及其在美团业务中的实践这篇文章中的部分内容。...Java线程实现原理及其在美团业务中的实践这篇文章写的非常好,除过本文内容之外这篇文章还讲述了的关于线程的背景,线程在业务中的实践和动态化线程等,所以想了解线程关于这些类容的可以阅读Java线程实现原理及其在美团业务中的实践这篇文章...如果读者为做服务端开发的同学那么强烈建议阅读Java线程实现原理及其在美团业务中的实践。 外观 外观主要是我们平常使用线程的时候所看到的一些点。...interruptIdleWorkers 方法在动态调整线程大小部分有源码讲述,它只会中断空闲的线程,不会中断正在执行任务的的线程。空闲的线程将会阻塞在线程的阻塞队列上。

43400

线程ThreadPoolExecutor源码分析

本文源自 公-众-号 IT老哥 的分享 IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章 前言 多线程是我们日常工作中很少能接触到的技术,但是面试的时候100%会被问到,万一工作中用到了基本不会...,本篇咱们就来深入分析线程的实现类ThreadPoolExecutor。...此处就是为什么《阿里巴巴 Java 开发手册》中不推荐使用Executors工具类创建线程的原因,要求使用 ThreadPoolExecutor 构造函数的方式,让写的同学更加明确线程的运行规则,规避资源耗尽的风险...对照流程图,我们再来看源码: //ctl中存放的是int值,int值得高低位保存了线程运行的状态和有效线程的数量 private final AtomicInteger ctl = new AtomicInteger...workerStarted) addWorkerFailed(w); } return workerStarted; } 5、shutdown方法 线程不用了,要关闭线程,下面是源码: public

32820

ThreadPoolExecutor 线程源码分析

private static final int CAPACITY = (1 << COUNT_BITS) - 1; 不得不佩服写 JDK 源码这些大佬,把一个变量用的这么好,ctl 变量通过位运算同时表达了线程状态和线程个数...然后再次执行任务)、DiscardPolicy(直接抛弃任务) keepAliveTime:存活时间,当线程个数大于了核心线程数,且处于空闲状态,这些空闲线程可存活的最大时间 源码拆解...因为 Woker 的构造器是通过线程工厂创建的线程分析如下 Worker(Runnable firstTask) { setState(-1); // inhibit interrupts until...w); } finally { mainLock.unlock(); } // 尝试把线程的状态设置为 TERMINATED,该方法在后面分析 tryTerminate...参考资料 https://juejin.im/entry/59b232ee6fb9a0248d25139a 《Java异步编程实战》

45530

Java线程分析

线程能有效管控线程,统一分配、调优,提供资源使用率; 更强大的功能,线程提供了定时、定期以及可控线程数等功能的线程,使用方便简单。...二、线程用法 Java API针对不同需求,利用Executors类提供了4种不同的线程:newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool...4.2 线程监控 利用线程提供的参数进行监控,参数如下: taskCount:线程需要执行的任务数量。...largestPoolSize:线程曾经创建过的最大线程数量,通过这个数据可以知道线程是否满过。如等于线程的最大大小,则表示线程曾经满了。 getPoolSize:线程线程数量。...五、参考资料 Java线程源码剖析(ThreadPoolExecutor) 线程池里的大学问:分析Java线程的创建 聊聊并发(三)Java线程分析和使用

40720

深入源码分析Java线程的实现原理

创建一个线程Java的并发编程中,线程是十分重要的,在Java中,创建一个线程比较简单: ? 我们通过创建一个线程对象,并且实现Runnable接口就可以实现一个简单的线程。可以利用上多核CPU。...这也就是化技术的思想,通过预先创建好多个线程,放在池中,这样可以在需要使用线程的时候直接获取,避免多次重复创建、销毁带来的开销。 线程的简单使用 以下代码,是在Java中创建线程: ?...可以看到,开发者想要在代码中使用线程还是比较简单的,这得益于Java给我们封装好的一系列API。但是,这些API的背后是什么呢,让我们来揭开这个迷雾,看清线程的本质。...这个是java中的goto语法。只能运用在break和continue后面。 接着看后面的代码: ? 第一个红框:获取线程主锁。...这两个钩子(beforeExecute,afterExecute)允许我们自己继承线程,做任务执行前后处理。 到这里,源代码分析到此为止。接下来做一下简单的总结。

65620

线程源码分析_executors源码解析

概述 在 java 中,线程 ThreadPoolExecutor 是一个绕不过去的类,它是享元模式思想的体现,通过在容器中创建一定数量的线程加以重复利用,从而避免频繁创建线程带来的额外开销。...一个设置合理的线程可以提高任务响应的速度,并且避免线程数超过硬件能力带来的意外情况。 在本文,将深入线程源码,了解线程的底层实现与运行机制。...,任务会优先加入工作队列,等等待核心线程消费; 线程工厂:线程创建新线程时使用的线程工厂; 拒绝策略:当工作队列与线程都满时,用于执行的策略; 二、线程状态 1.线程状态 线程拥有一个 AtomicInteger...private static final int TERMINATED = 3 << COUNT_BITS; 2.线程状态的计算 这里比较不好理解的是上述-1的位运算,下面我们来分析一下: 在计算机中...,二进制负数一般用补码表示,即源码取反再加一。

25620

java线程(六):ForkJoinPool源码分析之二(WorkQueue源码

在前面介绍了ForkJoinPool的骨架源码之后,我们来看看ForkJoinPool的核心组成。WorkQueue的源码。...config int 用于存储线程的index和model qlock volatile int 1 表示锁定,小于0的时候表示结束,线程的其他状态下这个值都应该为0 base volatile...3.9 runTask 在之前的文章分析外部提交task的时候,就提到了这个方法。实际上是runWorker调用的。 也就是说,线程在启动之后,一旦worker获取到task,就会运行。...break; } } } } return h; } 4.总结 本文对workQueue的源码进行了分析...至此,我们分析了workQueue的源码,对其内部实现的双端队列本身的操作进行了分析。为什么作者会自己实现一个Deque,而不是使用juc中已存在的容器。

69720

JUC线程ThreadPoolExecutor源码分析

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

1.1K40

大牛带你分析源码,学会正确使用 Java 线程

在日常的开发工作当中,线程往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。...答案是没有影响,线程依旧可以正常工作,但是异常却被吞掉了。这通常来说不是一个好事情,因为我们需要拿到原始的异常对象去分析问题。 那么怎样才能拿到原始的异常对象呢?...我们从线程源码着手开始研究这个问题。...当然网上关于线程源码解析文章有很多,这里限于篇幅,直接给出最相关的部分代码: finalvoidrunWorker(Workerw){Threadwt=Thread.currentThread();...通过submit提交任务到线程 这个同样很简单,我们还是先回到submit方法的源码: publicFuturesubmit(Callabletask){if(task==null)

56401

Java 线程原理分析

通过使用这些工具类,我们可以用低廉的代价使用多线程技术。 线程作为 Java 并发重要的工具类,在会用的基础上,我觉得很有必要去学习一下线程的相关原理。...3.原理分析 3.1 核心参数分析 3.1.1 核心参数简介 如上节所说,线程的核心实现即 ThreadPoolExecutor 类。该类包含了几个核心属性,这些属性在可在构造方法进行初始化。...具体细节这里就不多说了,并不复杂,大家可以自己去看下源码。 在线程池中,线程的复用是线程的关键所在。这就要求线程在执行完一个任务后,不能立即退出。...在本文中,我对线程的主要原理做了简要分析。虽然只是简要分析,但通过分析并撰写此篇文章,也使我个人对 Java 线程有了更深的认识。需要说明的是,限于时间原因,本文并未将线程所有的知识都说一遍。...参考 聊聊并发(三)Java线程分析和使用 - 方腾飞 深入理解Java线程 - 海子 Java线程18:线程 - 五月的仓颉 本文在知识共享许可协议 4.0 下发布,转载需在明显位置处注明出处

2.6K100

Java 线程原理分析

通过使用这些工具类,我们可以用低廉的代价使用多线程技术。 线程作为 Java 并发重要的工具类,在会用的基础上,我觉得很有必要去学习一下线程的相关原理。...原理分析 核心参数分析 核心参数简介 核心实现即 ThreadPoolExecutor 类。该类包含了几个核心属性,这些属性在可在构造方法进行初始化。...默认是 AbortPolicy,即直接抛出异常 线程创建规则 在 Java 线程实现中,线程所能创建的线程数量受限于 corePoolSize 和 maximumPoolSize 两个参数值。...Java 线程提供了4中拒绝策略实现类,如下: 实现类 说明...几种线程 在阿里巴巴Java开发手册中明确指出禁止使用Executors 工具类创建线程

69490

Java线程源码浅析

一、前言 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程线程进行统一分配、调优和监控,有以下好处:重用存在的线程、可有效控制最大并发线程数 二、怎么做...3.再次判断判断当前线程状态,如果线程没有RUNNING,且成功从阻塞队列中删除任务,则执行reject方法处理任务; 4.如果当前线程数等于0的极端情况下,可能出现一个任务刚被插入队列的同时,所有的线程都结束任务然后被销毁了...Worker 添加到workers hashset中,最后开始启动Worker中的线程t.start(),源码中 this.thread = getThreadFactory().newThread(this...回顾代码,好像也没有直接体现复用线程的,Worker每次都是new。...看整个线程的工作流程,有以下几个需要特别关注的并发点. 线程状态和工作线程数量的变更。这个由一个AtomicInteger变量 ctl来解决原子性问题。

23720

Java源码解析 - ThreadPoolExecutor 线程

源码讲解 在ThreadPoolExecutor的属性定义中频繁地用位运算来表示线程状态; 位运算是改变当前值的一种高效手段....下面继续分析addWorker addWorker 源码解析 根据当前线程状态,检查是否可以添加新的任务线程,若可以则创建并启动任务; 若一切正常则返回true; 返回false的可能性如下 线程没有处于...总结 线程的相关源码比较精炼,还包括线程的销毁、任务提取和消费等,与线程状态图一样,线程也有自己独立的状态转化流程,本节不再展开。...Java5后推出的ThreadPoolExecutor的如下构造函数 Java默认提供的线程 Java中的线程是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程...corePoolSize),几乎所有的execute()方法调用都是执行步骤2,而步骤2不需要获取全局锁 #源码分析 /** * 检查是否可以根据当前状态和给定的边界(核心或最大)

57130
领券