总结线程池
什么是线程池
线程池(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 在自…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...