当前位置: 首页 > news >正文

总结线程池

什么是线程池

线程池(Thread Pool)是一种用于管理和复用线程的技术,它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制,可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被广泛使用,如服务器端程序、并行计算、异步任务等。

线程池的好处包括

  1. 提高性能:由于线程的创建和销毁是一项耗时的操作,使用线程池可以避免频繁地创建和销毁线程,提高了程序的性能。

  2. 资源管理:线程池可以限制线程的数量,避免线程过多导致系统资源的浪费和性能下降。

  3. 控制并发度:通过控制线程池的大小,可以限制并发任务的数量,避免系统资源过载和响应时间过长的问题。

  4. 提供任务排队和调度:线程池可以对任务进行排队和调度,确保任务按照一定的顺序和优先级执行。

线程池的参数详细介绍

  1. 核心线程数(corePoolSize):核心线程数是线程池中保持活动状态的线程数量。在没有任务执行时,核心线程会一直保持存活状态。如果任务数量超过核心线程数,线程池会创建新的线程来执行任务。

  2. 最大线程数(maximumPoolSize):最大线程数是线程池中允许存在的最大线程数量。当任务数量超过核心线程数且任务队列已满时,线程池会创建新的线程,直到达到最大线程数。超过最大线程数的任务会根据配置的拒绝策略进行处理。

  3. 空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数时,多余的空闲线程会在一定时间内保持活动状态,等待新的任务。keepAliveTime 是空闲线程的存活时间,超过这个时间线程会被销毁,直到线程池的线程数量不超过核心线程数。

  4. 时间单位(TimeUnit):对于核心线程数、最大线程数和空闲线程存活时间,通常需要指定一个时间单位,如秒、毫秒等。

  5. 任务队列(workQueue):任务队列用于存储待执行的任务。线程池根据任务数量和线程池状态来决定任务的执行方式。常见的任务队列有无界队列和有界队列,如 LinkedBlockingQueue 和 ArrayBlockingQueue。

  6. 线程工厂(threadFactory):线程工厂用于创建新的线程实例。通过指定线程工厂,可以自定义线程的一些属性,如名称、优先级等。

  7. 拒绝策略(rejectedExecutionHandler):当任务数量超过线程池的最大线程数时,线程池会对新的任务采取一定的拒绝策略。常见的拒绝策略有直接抛出异常、丢弃任务、丢弃最旧的任务和调用者运行等。

正确地配置线程池参数可以避免线程过多或过少导致的性能问题,并提高任务的处理效率和并发度。

若把创建一个线程池想象成开个公司. 每个员工相当于一个线程.则:

corePoolSize: 正式员工的数量. (正式员工, 一旦录用, 永不辞退)
maximumPoolSize: 正式员工 +临时工的数目. (临时工: 一段时间不干活, 就被辞退).
keepAliveTime: 临时工允许的空闲时间. unit:
keepaliveTime 的时间单位, 是秒, 分钟, 还是其他值.
workQueue: 传递任务的阻塞队列
threadFactory: 创建线程的工厂, 参与具体的创建线程工作

RejectedExecutionHandler: 拒绝策略,如果任务量超出公司的负荷了接下来怎么处理.
AbortPolicy(): 超过负荷, 直接抛出异常.
CallerRunsPolicy(): 调用者负责处理
DiscardOldestPolicy(): 丢弃队列中最老的任务.
DiscardPolicy(): 丢弃新来的任务.

线程池的工作流程

  1. 创建线程池:在使用线程池之前,首先需要创建一个线程池实例。线程池可以使用编程语言或框架提供的相关API来创建,通常需要指定线程池的参数,如核心线程数、最大线程数、任务队列等。

  2. 提交任务:一旦线程池创建完成,就可以将需要执行的任务提交给线程池。任务可以是用户定义的代码块、函数或对象。任务的提交可以通过调用线程池提供的提交方法进行。

  3. 任务排队:当任务提交到线程池后,线程池会将任务添加到任务队列中。任务队列可以是有界队列或无界队列,它负责存储待执行的任务。

  4. 线程分配:线程池中的线程管理器会管理和分配线程。如果当前线程池中的线程数小于核心线程数,线程池会创建新的线程来执行任务。如果线程池中的线程数已经达到核心线程数,新的任务将被放入任务队列中等待执行。

  5. 任务执行:空闲的线程会从任务队列中取出任务,开始执行任务的代码。当一个线程执行完一个任务后,它会继续从任务队列中获取下一个任务并执行,直到任务队列为空。

  6. 拒绝策略:如果任务队列已满且线程池中的线程数已达到最大线程数,新提交的任务可能会被线程池拒绝。线程池会根据配置的拒绝策略来处理这些被拒绝的任务,可以选择抛出异常、丢弃任务、丢弃队列中最旧的任务或者由调用者线程执行任务。

  7. 线程回收:如果线程池中的线程处于空闲状态,并且超过了指定的空闲线程存活时间,这些空闲线程会被终止并从线程池中移除,以减少资源消耗。

使用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创建的"可缓存线程池"没有固定的线程数量限制,它会根据任务的到来自动创建线程。如果任务的到来速度过快,线程池可能会不断地创建新线程,导致线程数无限增长。这可能会消耗大量的系统资源,甚至导致系统崩溃。

相关文章:

总结线程池

什么是线程池 线程池&#xff08;Thread Pool&#xff09;是一种用于管理和复用线程的技术&#xff0c;它可以在多线程编程中有效地管理线程的创建、执行和销毁。是一种有效管理线程的机制&#xff0c;可以提高多线程编程的效率、性能和资源利用率。它在许多并发编程的场景中被…...

基础的 lftp 使用方法

lftp 是一个功能强大的文件传输工具&#xff0c;支持FTP、HTTP、SFTP、FISH等多种协议。它提供了一套丰富的命令&#xff0c;使得文件传输和管理更加简便。以下是一些基础的 lftp 使用方法&#xff1a; 连接到FTP服务器&#xff1a; lftp ftp://username:passwordhostname如果不…...

python之prettytable库的使用

文章目录 一 什么是prettytable二 prettytable的简单使用1. 添加表头2. 添加行3. 添加列4. 设置对齐方式4. 设置输出表格样式5. 自定义边框样式6. 其它功能 三 prettytable在实际中的使用 一 什么是prettytable prettytable是Python的一个第三方工具库&#xff0c;用于创建漂亮…...

google PGS 下一代id

前言&#xff1a;为了进一步增强用户的隐私及其多平台游戏体验&#xff0c;Play 游戏服务(PGS) 正在推出下一代玩家 ID&#xff0c;用户第一次玩游戏时&#xff0c;他们将始终被分配一个唯一的下一代玩家 ID&#xff0c;无论用户在什么设备或平台上玩游戏&#xff0c;该 ID 都将…...

【elasticsearch】关于elasticsearch的max_result_window限制问题的解决方式思考

事情起因&#xff1a;我们使用es作为日志搜索引擎&#xff0c;客户收集到的业务日志非常之大&#xff0c;每次查询后&#xff0c;返回页数较多&#xff0c;由于我们web界面限制每页返回150条&#xff0c;当客户翻到66页之后就会报错。 文章目录 前言 二、实验 1.默认生成20条数…...

音频光耦合器

音频光耦合器是一种能够将电信号转换为光信号并进行传输的设备。它通常由发光二极管&#xff08;LED&#xff09;和光敏电阻&#xff08;光电二极管或光敏电阻器&#xff09;组成。 在音频光耦合器中&#xff0c;音频信号经过放大和调节后&#xff0c;被转换为电流信号&#xf…...

【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中&#xff0c;引入了一个新的概念引用&#xff0c;与…...

生态系统服务(InVEST模型)供给与需求、价值核算技术及人类活动、重大工程项目、自然保护区、碳中和等领域中实际案例分析

对接工作实际项目及论文写作&#xff0c;解决参会者关注的重点及实际项目过程问题&#xff0c;采取逐步延伸的逻辑&#xff0c;不论您是小白亦或是已经能够成功运行InVEST模型生成结果&#xff0c;您可以自由选择课程内容&#xff0c;如果您是小白老师手把手教您&#xff0c;如…...

TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验

八 年 前 &#xff0c;我们构建了 TiDB&#xff0c;一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式&#xff0c;满足不断增长的可扩展性、灵活性和性能需求。 从那时起&#xff0c;PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…...

PXE-kickstart无人值守安装操作系统

PXE的概念&#xff1a; PXE&#xff08;Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff09;是由Intel公司开发的最新技术&#xff0c;工作于C/S的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操作系统…...

使用Flask.Request的方法和属性,获取get和post请求参数(二)

1、Flask中的request 在Python发送Post、Get等请求时&#xff0c;我们使用到requests库。Flask中有一个request库&#xff0c;有其特有的一些方法和属性&#xff0c;注意跟requests不是同一个。 2、Post请求&#xff1a;request.get_data() 用于服务端获取客户端请求数据。注…...

解决 idea maven依赖引入失效,无法正常导入依赖问题

解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题 idea是真的好用&#xff0c;不过里面的maven依赖问题有时候还真挺让人头疼&#xff0c;不少小…...

Python之集合(set)基础知识点

文章目录 1. 创建集合2. 获取集合的元素个数3. 向集合中添加元素4. 从集合中移除元素5. 判断元素是否在集合中6. 遍历集合7. 常用的集合操作7.1 并集7.2 交集7.3 差集 在Python中&#xff0c;集合&#xff08;Set&#xff09;是一种无序且不重复的数据结构。它是由一组用花括号…...

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. 主要教学内容 实验内容&#xff1a;安装、学习使用网络包分析工具Wireshark。所需学时&#xff1a;1。重难…...

智慧防灾:数字孪生技术的应用

最近的“杜苏芮”“卡努”有没有对大家产生影响呢&#xff1f; 频繁发生的台风和其他自然灾害引起了人们对于灾害预防和应对的高度关注。在这种背景下&#xff0c;数字孪生作为一项前沿技术&#xff0c;为灾害预防领域提供了全新的解决方案。本文就带大家了解一下数字孪生技术…...

Google 扫码器(仅限 Android)

Google 扫码器&#xff08;仅限 Android&#xff09; Google Code Scanner API 提供了全面的扫描解决方案&#xff0c;无需您的应用请求相机权限&#xff0c;同时保护用户隐私。这是通过将扫描代码委托给 Google Play 服务并仅将扫描结果返回给您的应用来完成的&#xff08;视…...

pandoc word转markdown之后正则修改

问题 用pandoc工具将doc文件转换为markdown文件后&#xff0c;有关图片的处理会变成&#xff1a; (./url路径){width“3.46875in” height“1.0729166666666667in”} 但是我要展示到前端的&#xff0c;前端组件用的v-md-preview&#xff0c;结果展示的时候&#xff0c;后面的宽…...

使用Python和wxPython将图片转换为草图

导语: 将照片转换为艺术风格的草图是一种有趣的方式&#xff0c;可以为您的图像添加独特的效果。在本文中&#xff0c;我们将介绍如何使用Python编程语言和wxPython图形用户界面库来实现这一目标。我们将探讨如何使用OpenCV库将图像转换为草图&#xff0c;并使用wxPython创建一…...

深入浅出对话系统——闲聊对话系统进阶

引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章&#xff0c;这是由OpenAI团队推出的&#xff0c;现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...