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

Java线程实现原理

当提交一个新任务到线程池时,线程池的处理流程如下: 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤需要获取全局锁)。...线程池的实现主要包括2部分,一个是线程管理(这里的线程管理只包括线程计数、线程信息存储等,不包括线程的阻塞/唤醒),另一个是阻塞队列(包括线程的排队/阻塞/唤醒)。 ?...从javadoc的引用中可以看出: 我们实现了一个简单的非重入互斥锁而不是使用ReentrantLock,因为我们不希望工作任务在调用setCorePoolSize等池控制方法时能够重新获取锁。...workQueue(阻塞队列)来做的,这里的线程阻塞唤醒实现原理请参考对应资料,这里不再具体展开。...,那么最后一起回顾下: 线程池的实现主要包括2部分,一个是线程管理(这里的线程管理只包括线程计数、线程信息存储等,不包括线程的阻塞/唤醒),另一个是阻塞队列(包括线程的排队/阻塞/唤醒)。

53220

线程实现原理-1

于是Doug Lea将实现了Runnable接口的任务放到一个容器中,然后启动一个线程执行完自己的任务后,还能从容器中拿出任务,调用Runnable接口的run方法,这样一个Thread类就能执行多个任务了...,当然可以启动多个线程同时消费容器中的任务,线程池就这样实现了 状态 先了解一下线程池的状态及线程数量的表示方式 image.png ?...默认用于非核心线程,但是当allowCoreThreadTimeOut=true时(这个值默认是false),同样用于核心线程 ThreadFactory是一个工厂类接口,我们可以实现这个接口,来自定义产生线程的方式...RejectedExecutionHandler是一个接口,有4个实现类,对应4种处理策略,这4个实现类是ThreadPoolExecutor的静态内部类 image.png 饱和策略接口,当队列和线程池都满了...执行r void rejectedExecution(Runnable r, ThreadPoolExecutor executor); } 来看上面例子中使用的饱和策略的实现方式,其他策略方式实现也挺简单

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

线程池的实现原理

线程池的实现原理 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数超过了最大数量超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行...**线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。...线程池核心设计与实现 Java中的线程池核心实现类是 ThreadPoolExecutor,还有一个工具类 **Excutors。**本章基于JDK 1.8的源码来分析Java线程池的核心设计与实现。...最下层的实现类 ThreadPoolExecutor实现最复杂的运行部分。...源码分析 通过上面流程图的分析直观的了解了线程池的工作原理,下面就通过源码看看是如何实现的,方法如下: public void execute(Runnable command) { if

58320

线程实现原理-2

前言 线程实现原理-1 addWorker实现 在看addWorker方法之前,我们先看一个例子,了解一下retry的使用 break retry 跳到retry处,且不再进入循环 continue...= null 说明任务被添加了,我们需要启动一个线程去执行它 fistTask == null 说明我只想启动一个线程去消费阻塞队列中的任务 // core为ture表示是核心线程,否则非核心线程 private...,继承了AbstractQueuedSynchronizer,实现了一个独占锁,status值为0表示未锁定状态,status值为1表示锁定状态,实现了Runnable接口,在执行run方法的时候,它执行完初始化的...firstTask后,还会从workQueue中取出任务执行,这样就不用新建一个线程执行任务,而是在一个线程中执行了好几个任务 Worker内部类 // 省略了一部分对锁的操作,简单的对AQS的一个实现...,因为正在运行的线程w.tryLock()会返回false shutdownNow实现 public List shutdownNow() { List

61530

线程池的实现原理分析

合理的设置线程池大小可以避免因为线程数超过硬件资源瓶颈带来的问题 Java 中提供的线程池 API   相信有很多同学或多或少都接触过线程池,也可能自己也研究过线程池的原理。...但是要想合理的使用线程池,那么势必要对线程池的原理有比较深的理解。 线程池的使用   要了解一个技术,我们仍然是从使用开始。JDK 为我们提供了几种不同的线程实现。...,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 线程池的实现原理分析   线程池的基本使用我们都清楚了,接下来我们来了解一下线程池的实现原理。   ...ThreadPoolExecutor 是线程池的核心,提供了线程池的实现。...我们来看看源码的实现源码比较长,看起来比较唬人,其实就做了两件事。 1)调用循环 CAS 操作来将线程数加 1; 2)新建一个线程并启用。

79020

Tomcat 的线程实现原理

一个激进创建线程的弹性线程池更符合我们的需求,你能给出相关的实现吗?实现后再测试一下,是否所有的任务都可以正常处理完成呢?...既然选择先扩容线程池再加入队列,那为什么不干脆把核心线程数设置大一些,然后核心线程数可回收这种策略呢?...复用线程池,任务很慢,主线程get结果的时候不会导致主线程卡死的状态吗?不是也提倡不同的任务用不同的线程池,那复用与不复用的边界在哪里呢?是要根据业务需求自己评估吗?...复用线程池是指不每次都创建线程池,线程池必须复用而不是按需创建,但不推荐一味混用一个线程池。...对于选择是否混用线程池,至少对于频+快的任务和少+慢的任务应该分开,还是要根据实际任务的性质来选择 如果我们不小心每次都创建了这样一个自定义的线程池(10核心线程,50最大线程,2秒回收),反复执行测试接口线程

74020

并发编程原理剖析——多线程实现原理

本章内容 1、JMM内存模型 2、JMM如何解决原子性、可见性、有序性问题 3、synchronized和volatile的原理 JMM怎么解决原子性、可见性、有序性的问题?...在Java中提供了一系列和并发处理相关的关键字,比如volatile、synchronized、final、juc等,这些就是Java内存模型封装的底层实现后提供给开发人员使用的关键字,在开发多线程代码的时候...除了volatile关键字外,还有synchronized和final两个关键字也可以实现可见性。...有序性 在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性,实现方式有所区别: volatile关键字会禁止指令重排序。...volatile防止指令重排序 指令重排的目的是为了大化的提高CPU利用率以及性能,CPU的乱序执行优化在单核时代并不影响正确性,但是 在多核时代的多线程能够在不同的核心上实现真正的并行,一旦线程之间共享数据

40820

线程池应用及实现原理剖析

为什么要用线程线程是不是越多好?...1M, 这个栈空间是要从操作系统内存中分配的,线程过多会消耗很多的内存 操作系统频繁切换线程上下文会影响性能 线程池的推出就是为了控制线程数量 线程原理 - 概念 线程池管理器: 用于创建并管理线程池..., 包括创建线程池, 销毁线程池, 添加新任务 工作线程线程池中的线程, 在没有任务时处于等待状态, 可以循环的执行任务 任务接口: 每个任务必须实现的接口,以供工作线程任务调度的执行, 它主要规定了任务的入口...线程池API - 接口定义和实现类 ? 线程池API - 方法定义 ExecutorService ? cheduledExecutorService ?...,该池的核心线程数由参数指定,最大线程数=Integer.MAX_VALUE 线程原理 - 任务执行过程 是否达到核心线程数量?

40210

Linux:断点原理实现

T 状态意味着:(TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态,接下来就可以通过 GDB 实现各种调试的操作了。...我们这次也要实现类似的效果,不过只是一个超简化版本,只考虑:在指定的位置暂停,获得进程的控制权。...实现思路 实现的思路非常简单 1. 先确定我们要断点的地址 在 GDB 中,我们是习惯对 行号 或者 函数名 直接设置断点,行号相对来说比较复杂,我们先展示 函数名 的。...在 Linux 环境下编译出来的可执行文件都是遵循 ELF 格式,如果没有特殊处理,它会保留比较完整的 符号表。 就拿开头的程序来当例子,可以通过 readelf -s a.out 查看: ?.../trace_test 22346 # 本文开头的进程 总结 关于断点的原理网上有很多文章提到,但比较多也是蜻蜓点水一笔带过,意犹未尽,干脆直接用最浅显的例子降低大家练手 成本!

1.8K10

Java多线程线程池(ThreadPoolExecutor)实现原理分析(一)

在上一篇文章Java中实现线程的3种方法介绍和比较中,我们讲解了Java中实现线程的3种方法。使用多线程,就必须要考虑使用线程池,今天我们来聊聊线程池的那些事。...如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。...今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小。...submit()方法是在ExecutorService中声明的方法,在AbstractExecutorService就已经有了具体的实现,在ThreadPoolExecutor中并没有对其进行重写,这个方法也是用来向线程池提交任务的...---- 本文只对ThreadPoolExecutor类做一个宏观的介绍,下一篇文章将会深入剖析ThreadPoolExecutor类,以此去深入了解线程池的实现原理

74570

手写线程池,对照学习ThreadPoolExecutor线程实现原理

手写一个线程池 2.1 实现流程 为了更好的理解和分析关于线程池的源码,我们先来按照线程池的思想,手写一个非常简单的线程池。...在这个方法里主要实现的就是,当前提交的线程是加入到worker、队列还是放弃。 addWorker,主要是类 Worker 的具体操作,创建并执行线程。...这里还包括了 getTask() 方法,也就是从队列中不断的获取未被执行的线程。 好,那么以上呢,就是这个简单线程实现的具体体现。...接下来,我们就开始分析线程池的源码,与我们实现的简单线程池参考对比,会更加容易理解! 3....线程池源码分析 3.1 线程池类关系图 a472dca836b0f2587fad45fd604ad537.png 以围绕核心类 ThreadPoolExecutor 的实现展开的类之间实现和继承关系,如图

32740

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

Java线程实现原理和源码分析 ? 前言 本文章是从2019年11月下旬开始打开写的,一直拖到2020年的年尾才开始写,直到2021年年初才写完。 时间太快也太慢~!...JDK1.8的源码来分析Java线程池的核心设计与实现。 本文参考了Java线程实现原理及其在美团业务中的实践这篇文章中的部分内容。...Java线程实现原理及其在美团业务中的实践这篇文章写的非常好,除过本文内容之外这篇文章还讲述了的关于线程池的背景,线程池在业务中的实践和动态化线程池等,所以想了解线程池关于这些类容的可以阅读Java线程实现原理及其在美团业务中的实践这篇文章...如果读者为做服务端开发的同学那么强烈建议阅读Java线程实现原理及其在美团业务中的实践。 外观 外观主要是我们平常使用线程池的时候所看到的一些点。...最下层的实现类ThreadPoolExecutor实现最复杂的运行部分: 可以自动创建、管理和复用指定数量的一组线程,适用方只需提交任务即可 线程安全,ThreadPoolExecutor内部有状态、核心线程

52220
领券