Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑

多线程的问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间

那么一个很自然的想法就出现了,如果能有一种技术使得线程可以复用,即执行完一个任务,并不被销毁,而是可以继续去执行其他任务就好了。

就此,线程池技术应运而生。

线程池的运行逻辑如下:

  • 作为一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
  • 线程池线程都是后台线程。
  • 每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
  • 如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池会自动添加另一个辅助线程,以确保所有处理器都保持繁忙状态。这样可以更有效地利用系统资源,提高并发处理能力
  • 如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程,但线程的数目永远不会超过最大值。
  • 超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

线程池的组成部分主要分为3个部分,这三部分配合工作得到一个完整的线程池:

  1. 任务队列,存储需要处理的任务,由工作的线程来处理这些任务
    • 通过线程池提供的API函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除。
    • 已处理的任务会被从任务队列中删除
    • 线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程
  2. 工作的线程(任务队列任务的消费者),N个
    • 线程池中维护了一定数量的工作线程, 他们的作用是是不停的读任务队列, 从里边取出任务并处理
    • 工作的线程相当于是任务队列的消费者角色
    • 如果任务队列为空,工作的线程将会被阻塞(使用条件变量/信号量阻塞
    • 如果阻塞之后有了新的任务,由生产者将阻塞接触,工作线程开始工作。
  3. 管理者线程(不处理任务队列中的任务),1个
    • 特的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测。
      • 当任务过多的时候,可以适当的创建一些新的工作线程(消费者)
      • 当任务过少的时候,可以适当的销毁一些工作的线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django.template.exceptions.TemplateDoesNotExist: bootstrap3/field.html

django使用xadmin时报错 1、报错原因 django.template.exceptions.TemplateDoesNotExist: bootstrap3/field.html2、原因 在django中使用xadmin时会报这个错,这是由于django高版本与xadmin不兼容导致的。 3、解决方案 导入库: pip install crispy_bootstrap3 -i https:…

蓝桥杯刷题-毕业旅行问题

731. 毕业旅行问题 - AcWing题库 /* 起点变为1 ~ n - 1号点&#xff0c;终点变为0号点 */ #include <bits/stdc.h>using namespace std; #define x first #define y second typedef long long LL; typedef pair<int , int> PII;const int N 10 , M (1 << …

AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇

悟纤之歌 这是利用AI为自己制作的一首歌&#xff0c;如果你也感兴趣&#xff0c;可以花点时间阅读下本篇文章。 ​ 导读 随着新一代AI音乐创作工具Suno V3、Stable audio2.0、天工SkyMusic的发布&#xff0c;大家玩自创音乐歌曲&#xff0c;玩的不亦乐乎。而有创业头脑的朋友…

mysql 转pg 两者不同的地方

因项目数据库&#xff08;原来是MySQL&#xff09;要改成PostgreSQL。 项目里面的sql要做一些调整。 1&#xff0c;写法上的区别&#xff1a; 1&#xff0c;数据准备&#xff1a; 新建表格&#xff1a; CREATE TABLE property_config ( CODE VARCHAR(50) NULL…

【UE5.1】使用MySQL and MariaDB Integration插件——(4)修改、插入、删除数据

目录 效果 步骤 一、修改 二、插入、删除 在上一篇博客&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;3&#xff09;表格形式显示数据&#xff09;基础上继续实现修改、插入和删除数据库数据的功能 效果 修改数据&#xff1a; 插入数据&…

探索ChatGPT写作新视野

ChatGPT无限次数:点击直达 探索ChatGPT写作新视野 在当今信息爆炸的时代&#xff0c;人们对于文字内容的需求愈发增长&#xff0c;而人工智能技术的不断发展则为文本生成领域带来了全新的可能性。ChatGPT作为自然语言处理领域的顶尖技术之一&#xff0c;受到了广泛关注和应用。…

开发语言漫谈-python

python的语法和C完全不同&#xff0c;但是它也是C写的。也就是想成为高手&#xff0c;C是必备武功。不是每个人都想成为武林高手。所以客观上需要个简单上手开发效率高的语言&#xff0c;就这样python诞生了。python的发明人其实不喜欢蟒蛇&#xff0c;但是不知道为啥选这个名字…

java线程(1)

1、多线程启动 有两种启动方式 1、实现Runable接口 2、继承Thread类并且重写run&#xff08;&#xff09;方法 在执行进程中的任务才会产生线程&#xff0c;所以需要实现Runable接口并且重写run&#xff08;&#xff09;方法&#xff0c;然后将Runable的实现对象作为参数传…

Zynq7000系列中的功耗管理

功耗优化可以从选择合适的Zynq 7000 SoC设备开始。对于低功耗应用&#xff0c;可以选择7z010或7z020双核设备&#xff0c;或者7z007s、7z012s或7z014s单核设备。通过关闭设备的PL侧&#xff0c;可以大幅度降低功耗。I/O电压和终端选择也会影响功耗。可以停止向单独的PS子系统提…

深度学习的社交网络:用户行为分析

1.背景介绍 社交网络是当今互联网的一个重要领域,它们为人们提供了一种快速、便捷的方式来与他人交流、分享信息和建立社交关系。社交网络的数据量巨大,包括用户的个人信息、互动记录、内容等。这些数据为企业和组织提供了丰富的信息来源,可以用于用户行为分析、推荐系统、…

BIM和数字孪生

BIM&#xff08;建筑信息建模&#xff09;是在计算机辅助设计等技术基础上发展起来的多维模型信息集成技术&#xff0c;是对建筑工程物理特征和功能特性信息的数字化承载、可视化表达。 BIM技术在施工控制和可视化模拟方面进行了创新&#xff0c;可实现可视化效果设计、检验模…

女上司问我:误删除PG百万条数据,可以闪回吗?

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验 擅长主流数据Oracle、MySQL、PG、openGauss运维 备份恢复&#xff0c;安装迁移&#xff0c;性能优化、故障应急处理等可提供技术业务&#xff1a; 1.DB故障处理/疑难杂症远程支援 2.Mysql/PG/Oracl…

UML 介绍

前言 UML 简介。 文章目录 前言一、简介1、事务2、关系1&#xff09;依赖2&#xff09;关联聚合组合 3&#xff09;泛化4&#xff09;实现 二、类图三、对象图四、用例图五、交互图1、序列图&#xff08;顺序图&#xff09;2、通信图 六、状态图七、活动图八、构件图&#xff0…

C#探索之路基础夯实篇(5):语法糖概念解析

C#探索之路基础夯实篇(5)&#xff1a;语法糖概念解析 文章目录 C#探索之路基础夯实篇(5)&#xff1a;语法糖概念解析1、概念定义2、Lua中的语法糖3、C#中的语法糖4、C中的语法糖5、优缺点辨析6、适用范围7、总结 从之前一开始接触lua的时候开始&#xff0c;开始第一次接触到语法…

python基础语法+爬虫+图像处理+NumpyPandas数据处理(12天速成,第7天上-爬虫Scrapy)

爬虫&#xff08;Scrapy&#xff09;:写一段程序代码&#xff08;网络访问&#xff09;&#xff0c;自动获取网页&#xff08;网络&#xff09;上的数据服务端语言&#xff1a;网络编程&#xff0c;都可以作为爬虫java c c python 等均可写爬虫程序js不是一个典型的服务端程序&…

【数据结构(七)】二叉树

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构的知识 目录 1.前言2.树形结构2.1树的概念2.2常见概念2.3树的表示形式 3.二叉树3.1概念3…

ES源码二:集群启动过程

命令行参数解析 Elasticsearch&#xff1a;在main里面创建了Elasticsearch实例&#xff0c;然后调用了main方法&#xff0c;这个main方法最终会调用到父类Command的main方法 这里做了几件事&#xff1a; 注册一个 ShutdownHook&#xff0c;其作用就是在系统关闭的时候捕获IO…

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …

Python机器学习项目开发实战:如何预测建模

注意&#xff1a;本文提供下载的教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 在Python中进行机器学习项目开发实战&#xff0c;预测建模是一个常见的应用场景。以下是一个简化的步骤指南&…

C++11(下篇)

文章目录 C111. 模版的可变参数1.1 模版参数包的使用 2. lambda表达式2.1 Lambda表达式语法捕获列表说明 2.2 lambda的底层 3. 包装器3.1 function包装器3.2 bind 4. 线程库4.1 thread类4.2 mutex类4.3 atomic类4.4 condition_variable类 C11 1. 模版的可变参数 C11支持模版的…