总结线程池
什么是线程池
线程池(Thread Pool)是一种用于管理和复用线程的技术,它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制,可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被广泛使用,如服务器端程序、并行计算、异步任务等。
线程池的好处包括
提高性能:由于线程的创建和销毁是一项耗时的操作,使用线程池可以避免频繁地创建和销毁线程,提高了程序的性能。
资源管理:线程池可以限制线程的数量,避免线程过多导致系统资源的浪费和性能下降。
控制并发度:通过控制线程池的大小,可以限制并发任务的数量,避免系统资源过载和响应时间过长的问题。
提供任务排队和调度:线程池可以对任务进行排队和调度,确保任务按照一定的顺序和优先级执行。
线程池的参数详细介绍
核心线程数(corePoolSize):核心线程数是线程池中保持活动状态的线程数量。在没有任务执行时,核心线程会一直保持存活状态。如果任务数量超过核心线程数,线程池会创建新的线程来执行任务。
最大线程数(maximumPoolSize):最大线程数是线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务会根据配置的拒绝策略进行处理。
空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数时,多余的空闲线程会在一定时间内保持活动状态,等待新的任务。keepAliveTime 是空闲线程的存活时间,超过这个时间线程会被销毁,直到线程池的线程数量不超过核心线程数。
时间单位(TimeUnit):对于核心线程数、最大线程数和空闲线程存活时间,通常需要指定一个时间单位,如秒、毫秒等。
任务队列(workQueue):任务队列用于存储待执行的任务。线程池根据任务数量和线程池状态来决定任务的执行方式。常见的任务队列有无界队列和有界队列,如 LinkedBlockingQueue 和 ArrayBlockingQueue。
线程工厂(threadFactory):线程工厂用于创建新的线程实例。通过指定线程工厂,可以自定义线程的一些属性,如名称、优先级等。
拒绝策略(rejectedExecutionHandler):当任务数量超过线程池的最大线程数时,线程池会对新的任务采取一定的拒绝策略。常见的拒绝策略有直接抛出异常、丢弃任务、丢弃最旧的任务和调用者运行等。
正确地配置线程池参数可以避免线程过多或过少导致的性能问题,并提高任务的处理效率和并发度。
若把创建一个线程池想象成开个公司. 每个员工相当于一个线程.则:
corePoolSize: 正式员工的数量. (正式员工, 一旦录用, 永不辞退)
maximumPoolSize: 正式员工 +临时工的数目. (临时工: 一段时间不干活, 就被辞退).
keepAliveTime: 临时工允许的空闲时间. unit:
keepaliveTime 的时间单位, 是秒, 分钟, 还是其他值.
workQueue: 传递任务的阻塞队列
threadFactory: 创建线程的工厂, 参与具体的创建线程工作RejectedExecutionHandler: 拒绝策略,如果任务量超出公司的负荷了接下来怎么处理.
AbortPolicy(): 超过负荷, 直接抛出异常.
CallerRunsPolicy(): 调用者负责处理
DiscardOldestPolicy(): 丢弃队列中最老的任务.
DiscardPolicy(): 丢弃新来的任务.
线程池的工作流程
创建线程池:在使用线程池之前,首先需要创建一个线程池实例。线程池可以使用编程语言或框架提供的相关API来创建,通常需要指定线程池的参数,如核心线程数、最大线程数、任务队列等。
提交任务:一旦线程池创建完成,就可以将需要执行的任务提交给线程池。任务可以是用户定义的代码块、函数或对象。任务的提交可以通过调用线程池提供的提交方法进行。
任务排队:当任务提交到线程池后,线程池会将任务添加到任务队列中。任务队列可以是有界队列或无界队列,它负责存储待执行的任务。
线程分配:线程池中的线程管理器会管理和分配线程。如果当前线程池中的线程数小于核心线程数,线程池会创建新的线程来执行任务。如果线程池中的线程数已经达到核心线程数,新的任务将被放入任务队列中等待执行。
任务执行:空闲的线程会从任务队列中取出任务,开始执行任务的代码。当一个线程执行完一个任务后,它会继续从任务队列中获取下一个任务并执行,直到任务队列为空。
拒绝策略:如果任务队列已满且线程池中的线程数已达到最大线程数,新提交的任务可能会被线程池拒绝。线程池会根据配置的拒绝策略来处理这些被拒绝的任务,可以选择抛出异常、丢弃任务、丢弃队列中最旧的任务或者由调用者线程执行任务。
线程回收:如果线程池中的线程处于空闲状态,并且超过了指定的空闲线程存活时间,这些空闲线程会被终止并从线程池中移除,以减少资源消耗。
使用Executors 创建常见的线程池
newFixedThreadPool: 创建固定线程数的线程池
newCachedThreadPool: 创建线程数目动态增长的线程池.
newSingleThreadExecutor:创建只包含单个线程的线程池.
newScheduledThreadPool: 设定 延迟时间后执行命令,或者定期执行命令. 是进阶版的
Timer.
Executors 本质上是 ThreadPoolExecutor 类的封装.
使用newFixedThreadPool工厂方法创建“固定数量的线程池”:
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, // 核心线程数nThreads, // 最大线程数0L, // 线程最大空闲(Idle)时长TimeUnit.MILLISECONDS, // 时间单位:毫秒new LinkedBlockingQueue<Runnable>() //任务的排队队列,无界队列);}
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, // 核心线程数1, // 最大线程数0L, // 线程最大空闲(Idle)时长TimeUnit.MILLISECONDS, //时间单位:毫秒new LinkedBlockingQueue<Runnable>() //无界队列));}
newCachedThreadPool
public static ExecutorService newCachedThreadPool(){return new ThreadPoolExecutor(0, // 核心线程数Integer.MAX_VALUE, // 最大线程数60L, // 线程最大空闲(Idle)时长TimeUnit.MILLISECONDS, // 时间单位:毫秒new SynchronousQueue<Runnable>() // 任务的排队队列,无界队列);}
newScheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, // 核心线程数Integer.MAX_VALUE, // 最大线程数0, //线程最大空闲(Idle)时长NANOSECONDS,//时间单位new DelayedWorkQueue() //任务的排队队列);}
使用Executors创建的"可缓存线程池"没有固定的线程数量限制,它会根据任务的到来自动创建线程。如果任务的到来速度过快,线程池可能会不断地创建新线程,导致线程数无限增长。这可能会消耗大量的系统资源,甚至导致系统崩溃。
相关文章:
总结线程池
什么是线程池 线程池(Thread Pool)是一种用于管理和复用线程的技术,它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制,可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被…...
基础的 lftp 使用方法
lftp 是一个功能强大的文件传输工具,支持FTP、HTTP、SFTP、FISH等多种协议。它提供了一套丰富的命令,使得文件传输和管理更加简便。以下是一些基础的 lftp 使用方法: 连接到FTP服务器: lftp ftp://username:passwordhostname如果不…...
python之prettytable库的使用
文章目录 一 什么是prettytable二 prettytable的简单使用1. 添加表头2. 添加行3. 添加列4. 设置对齐方式4. 设置输出表格样式5. 自定义边框样式6. 其它功能 三 prettytable在实际中的使用 一 什么是prettytable prettytable是Python的一个第三方工具库,用于创建漂亮…...
google PGS 下一代id
前言:为了进一步增强用户的隐私及其多平台游戏体验,Play 游戏服务(PGS) 正在推出下一代玩家 ID,用户第一次玩游戏时,他们将始终被分配一个唯一的下一代玩家 ID,无论用户在什么设备或平台上玩游戏,该 ID 都将…...
【elasticsearch】关于elasticsearch的max_result_window限制问题的解决方式思考
事情起因:我们使用es作为日志搜索引擎,客户收集到的业务日志非常之大,每次查询后,返回页数较多,由于我们web界面限制每页返回150条,当客户翻到66页之后就会报错。 文章目录 前言 二、实验 1.默认生成20条数…...
音频光耦合器
音频光耦合器是一种能够将电信号转换为光信号并进行传输的设备。它通常由发光二极管(LED)和光敏电阻(光电二极管或光敏电阻器)组成。 在音频光耦合器中,音频信号经过放大和调节后,被转换为电流信号…...
【C++精华铺】3.C++入门 引用(const)、内联函数
目录 1. 引用 1.1 引用特性 1.2 常引用 1.2.1 权限放大 1.2.2 权限缩小 1.3 使用场景 1.3.1 传参 1.3.2 做返回值 1.4 传值和传引用的效率比较 1.5 引用和指针的区别 2. 内联函数 2.1 inline 2.2 特性 1. 引用 在C中,引入了一个新的概念引用,与…...
生态系统服务(InVEST模型)供给与需求、价值核算技术及人类活动、重大工程项目、自然保护区、碳中和等领域中实际案例分析
对接工作实际项目及论文写作,解决参会者关注的重点及实际项目过程问题,采取逐步延伸的逻辑,不论您是小白亦或是已经能够成功运行InVEST模型生成结果,您可以自由选择课程内容,如果您是小白老师手把手教您,如…...
TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验
八 年 前 ,我们构建了 TiDB,一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式,满足不断增长的可扩展性、灵活性和性能需求。 从那时起,PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…...
PXE-kickstart无人值守安装操作系统
PXE的概念: PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于C/S的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统…...
使用Flask.Request的方法和属性,获取get和post请求参数(二)
1、Flask中的request 在Python发送Post、Get等请求时,我们使用到requests库。Flask中有一个request库,有其特有的一些方法和属性,注意跟requests不是同一个。 2、Post请求:request.get_data() 用于服务端获取客户端请求数据。注…...
解决 idea maven依赖引入失效,无法正常导入依赖问题
解决 idea maven依赖引入失效,无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效,无法正常导入依赖问题 idea是真的好用,不过里面的maven依赖问题有时候还真挺让人头疼,不少小…...
Python之集合(set)基础知识点
文章目录 1. 创建集合2. 获取集合的元素个数3. 向集合中添加元素4. 从集合中移除元素5. 判断元素是否在集合中6. 遍历集合7. 常用的集合操作7.1 并集7.2 交集7.3 差集 在Python中,集合(Set)是一种无序且不重复的数据结构。它是由一组用花括号…...
flutter 没有open android module in Android studio 插件代码爆红
参考 1.结论 其实就是缺少这个文件 2.解决方案有两个 2.1 方案一 手动创建一个,命名规则是项目名字‘_android’‘.iml’ 内容如下: <?xml version"1.0" encoding"UTF-8"?> <module type"JAVA_MODULE" version"4">&l…...
计算机网络实验2:网络嗅探
文章目录 1. 主要教学内容2. Wireshark介绍3. Wireshark下载4. 使用Wireshark捕获包4.1 选择网卡4.2 停止抓包4.3 保存数据 5. Wireshark的过滤规则6. Wireshark实例 1. 主要教学内容 实验内容:安装、学习使用网络包分析工具Wireshark。所需学时:1。重难…...
智慧防灾:数字孪生技术的应用
最近的“杜苏芮”“卡努”有没有对大家产生影响呢? 频繁发生的台风和其他自然灾害引起了人们对于灾害预防和应对的高度关注。在这种背景下,数字孪生作为一项前沿技术,为灾害预防领域提供了全新的解决方案。本文就带大家了解一下数字孪生技术…...
Google 扫码器(仅限 Android)
Google 扫码器(仅限 Android) Google Code Scanner API 提供了全面的扫描解决方案,无需您的应用请求相机权限,同时保护用户隐私。这是通过将扫描代码委托给 Google Play 服务并仅将扫描结果返回给您的应用来完成的(视…...
pandoc word转markdown之后正则修改
问题 用pandoc工具将doc文件转换为markdown文件后,有关图片的处理会变成: (./url路径){width“3.46875in” height“1.0729166666666667in”} 但是我要展示到前端的,前端组件用的v-md-preview,结果展示的时候,后面的宽…...
使用Python和wxPython将图片转换为草图
导语: 将照片转换为艺术风格的草图是一种有趣的方式,可以为您的图像添加独特的效果。在本文中,我们将介绍如何使用Python编程语言和wxPython图形用户界面库来实现这一目标。我们将探讨如何使用OpenCV库将图像转换为草图,并使用wxPython创建一…...
深入浅出对话系统——闲聊对话系统进阶
引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章,这是由OpenAI团队推出的,现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
