线程池实现原理ThreadPoolExecutor

C++线程池ThreadPoolExecutor实现原理 1. 为什么要使用线程池 在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处: 降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统性能损耗; 提升系统响应速度。通过复用线程,省去创建线程的过程,因此整体上提升了系统的响应速度; 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,因此,需要使用线程池来管理线程。 2. 线程池的工作 阅读详情
线程池实现原理

具体需要看ThreadPoolExecutor内部实现:

	//阻塞队列
	private final BlockingQueue<Runnable> workQueue;
	//互斥锁
	private final ReentrantLock mainLock = new ReentrantLock();
	// 线程集合 一个对应的线程
	private final HashSet<Worker> workers = new HashSet<>();
    //终止条件
    private final Condition termination = mainLock.newCondition();
    //线程池数量曾到达的最大值
    private int largestPoolSize;
    //已完成线程数量
    private long completedTaskCount;
    //用户创建线程
    private volatile ThreadFactory threadFactory;
    //拒绝策略
    private volatile RejectedExecutionHandler handler;
    //线程池维护线程所允许的空闲时间
    private volatile long keepAliveTime;
    //判断线程是否存活
    private volatile boolean allowCoreThreadTimeOut;
    //线程池维护线程的核心线程数量
    private volatile int corePoolSize;
    //线程池最大线程数量
    private volatile int maximumPoolSize;
    
	public ThreadPoolExecutor(int corePoolSize,
	                          int maximumPoolSize,
	                          long keepAliveTime,
	                          TimeUnit unit,
	                          BlockingQueue<Runnable> workQueue)
	corePoolSize:核心线程数
	maximumPoolSize:最大线程数
	keepAliveTime:线程存活时间(在corePore<*<maximumPoolSize情况下有用)
	unit:存活时间的时间单位
	workQueue:阻塞队列(用来保存等待被执行的任务)

流程图:

在这里插入图片描述

步骤详解:

Executor(runable) > 核心线程数 > 队列 > 最大线程数 > 阻塞

jdk线程池ThreadPoolExecutor工作原理解析(自己动手实现线程池) 在日常开发中经常会遇到需要使用其它线程将大量任务异步处理的场景(异步化以及提升系统的吞吐量),而在使用线程的过程中却存在着两个痛点。在java等很多主流语言中每个逻辑上的线程底层都对应着一个系统线程(不考虑虚拟线程的情况)。操作系统创建一个新线程是存在一定开销的,在需要执行大量的异步任务时,如果处理每个任务时都直接向系统申请创建一个线程来执行,并在任务执行完毕后再回收线程,则创建/销毁大量线程的开销将无法忍受。每个系统线程都会占用一定的内存空间,且系统在调度不同线程上下文切换时存在一定的cpu开销。 阅读详情

相关推荐

C++线程池ThreadPoolExecutor的实现原理

该线程池使用了C++标准库中的线程、队列和同步原语(互斥锁和条件变量)来实现线程的管理和任务的调度。线程池是一种常见的并发编程模型,它可以帮助我们管理和复用线程资源,从而提高并发执行任务的效率。线程池管理器(ThreadPoolManager):线程池的核心是线程池管理器,它负责管理线程池的创建、销毁和任务分配。工作线程(Worker Threads):工作线程是线程池中的执行单元,它负责从任务队列中获取任务并执行。当有新的任务提交到线程池时,线程池管理器将任务放入任务队列中,等待工作线程的执行。

JfBackend的博客 207

线程池工作原理

一、线程池默认工作流程 1、线程在有任务的时候会常见核心的线程数corePoolSize 2、当线程满了(有任务但是线程被使用完)不会立即扩容,而是放到阻塞队列中,当阻塞队列满了之后才会继续创建线程。 3、如果队列满了,线程数达到最大线程数则会执行拒绝策略。 4、当线程数大于核心线程数事,超过KeepAliveTime(闲置时间),线程会被回收,最终会保持corePoolSize个线程。 二、五种实现 1、newSingleThreadExecutor() 池里只有一条线程,如果线程因为异常而停止,会自动

promiseful的博客 4万+

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC(Internet Protocol Camera,网络摄像头),它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输,接受网络监控主机(NVR或监控管理平台)的管理。IPC可与路由器、交换机、NVR等设备组建成为监控系统。

学无止境,Fighting! 1万+

深入理解线程池(详解)

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。

weixin_44825912的博客 1万+

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2621

多目标优化NSGA-II(快速精英非支配排序遗传算法)及python实现

文章目录前言一、什么是NSGA-II?二、学习NSGA-II1.快速非支配排序算法2.密度估计3.拥挤比较算子4.主循环5.代码6.总结 前言 NSGA-II适用于复杂的多目标优化问题,是K-Deb教授在2000年在一篇paper《MOEAs — A fast and elitist multi-objective genetic algorithm: nsga2》提出。 Keywords: optimization; multi-objective evolutionary algorithm; no

ricky_blog 9744

线程池工作原理深入解析

本文系统讲解了Java线程池的核心原理与实现。首先介绍了线程的生命周期,接着阐述了使用线程池的必要性:避免频繁创建销毁线程带来的性能损耗。文章详细解析了ThreadPoolExecutor的7个核心参数,包括核心线程数、最大线程数、存活时间等,并通过图示展示了线程池的工作原理(核心线程→阻塞队列→临时线程→拒绝策略)。最后给出了线程池的代码实现示例,演示了FixedThreadPool的使用方式。整篇文章深入浅出地剖析了线程池的运行机制,是理解Java并发编程中线程池管理的重要参考。

m0_70325779的博客 6665

【C++ 使用libxlsxwriter库向excel表格中插入图片 CMake + VS2019】

使用libxlsxwriter向excel表格插入图片

恒星游历者的博客 753

线程池的工作原理

线程池

虎神大帝的博客 4632

WinCC ActiveX控件“许可证缺失”故障排查:从注册表修复到系统兼容性全解析

本文深入解析WinCC ActiveX控件报错“未找到许可证信息”的根本原因与解决方案。核心在于系统注册表中控件的设计时许可证密钥丢失或损坏。文章提供了从手动修复注册表、排查64位系统兼容性,到预防性环境部署的全流程专业指南,帮助工程师彻底解决这一常见故障。

oil88的博客 646

【Matlab】飞行器气动弹性仿真与分析

气动弹性是飞行器设计领域的核心交叉学科,融合了空气动力学、结构动力学和控制理论,主要研究飞行器结构在气动力作用下的弹性变形、振动响应及相互耦合规律,直接影响飞行器的飞行稳定性、操纵性和结构安全性。随着飞行器向高速度、高机动性、轻量化方向发展,气动弹性问题愈发突出,如颤振、发散、嗡鸣等现象,严重时会导致飞行器结构破坏甚至飞行事故,因此气动弹性仿真与分析已成为飞行器设计、验证和优化的关键环节。当前,飞行器气动弹性仿真面临诸多技术挑战:气动力与结构变形的强耦合特性难以精准描述,易出现仿真误差;

unber的博客 233

线程池原理

线程池是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。核心线程数最大线程数空闲存活时间单位时间任务队列线程工厂和拒绝策略。corePoolSize:核心线程数,即线程池中始终保持的线程数量。maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。keepAliveTime:线程空闲时间,超过这个时间的非核心线程会被销毁。workQueue:任务队列,存放待执行的任务。hreadFactory:线程工厂,用于创建新线程。

m0_61057201的博客 3414

【LAMMPS学习】八、基础知识(2.1)2D模拟

此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。LAMMPS 源代码分发的examples目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各种模拟。

荷塘阅色 1248

ThreadPoolExecutor线程池实现原理与源码解析

ThreadPoolExecutor线程池原理 + 源码,了解一下。

Sicimike的博客 3147

LDRA Testbed(TBrun)软件单元测试_操作指南

通过前面的几篇文章,使用Testbed进行软件静态分析的内容已经基本讲解完毕。从这篇文章开始,将继续讲解如何使用TBrun进行软件单元测试、软件集成测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 7758

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

线程池ThreadPoolExecutor实现原理分析

前言 线程池是并发中一项常用的优化方法,通过对线程的复用,减少线程的创建,降低资源消耗,提高程序响应速度。在Java中我们一般通过Executors提供的工厂方法来创建线程池,但是线程池的最终实现类是ThreadPoolExecutor,下面我们详细分析一下ThreadPoolExecutor的实现。 基本使用 ...

Ryanqy的专栏 684

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

并发编程 — ThreadPoolExecutor 线程池实现原理

一、线程池的概念 线程池(Thread Pool)是一种基于池化思想管理线程的工具。类似于我们连接数据库的连接池。 线程池解决的核心问题就是资源管理问题。在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入。这种不确定性将带来以下若干问题: 创建一个线程,却需要调用操作系统内核的 API,然后操作系统要为线程分配一系列的资源,创建成本很高 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大。 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险。 系统无法合

small_love的专栏 2080

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的。

华为云官方博客 1325

线程池ThreadPoolExecutor实现原理

引言 线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 但是要做到合理的利..

augfun的博客 3615

线程池ThreadPoolExecutor的实现原理?

原文地址:https://www.jianshu.com/p/ade771d2c9c0线程池有多重要#####线程是一个程序员一定会涉及到的一个概念,但是线程的创建和切换都是代价比较大的。所以,我们有没有一个好的方案能做到线程的复用呢?这就涉及到一个概念——线程池。合理的使用线程池能够带来3个很明显的好处:1.降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗2.提高响应速度:任务到达...

75闪光雷的博客 955

硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理

前提很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章。之前在分析扩展线程池实现可回调的Future时候...

Throwable 3713

ThreadPoolExecutor线程池的实现原理

当向线程池提交一个任务之后,线程池是如何处理这个任务的呢?

麦叔 523

Java线程池ThreadPoolExecutor实现原理剖析

继承结构 继承结构看起来很清晰,最顶层的Executor只提供了一个最简单的void execute(Runnable command)方法,然后是ExecutorService,ExecutorService提供了一些管理相关的方法,例如关闭、判断当前线程池的状态等,另外不同于Executor#execute,ExecutorService提供了一系列方法,可以将任务包装成一个Future,从...

qq_33349365的博客 206

线程池(ThreadPool):使用ExecutorService、ThreadPoolExecutor等线程池管理并发任务以及底层实现原理

核心线程数,当提交任务时,如果当前线程数小于核心线程数,即使线程池中有空闲线程,也会创建新的线程来执行任务。:线程池的最大线程数,当任务队列已满且线程数小于最大线程数时,线程池会创建新线程来执行任务。:非核心线程的空闲时间超过此时间后将被终止(如果当前线程数大于workQueue:任务队列,用于存放等待执行的任务。:有界队列,任务达到队列上限时,新的任务将被阻塞或拒绝。:无界队列,适合任务量较大的场景。:没有容量的队列,提交的任务必须直接交给线程执行,否则会创建新线程。

Flying_Fish_roe的博客 1833
上一篇: Android Service和IntentService的区别
下一篇: ActivityManagerService(简称AMS)解析
jhonjson
博客等级 码龄11年 220粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值