线程池概述

news2024/12/31 6:30:36

1.1 线程池概念

        在处理大量并发任务的时候,如果按照传统的方式,来一个任务请求,创建一个线程来进行任务的处理,大量线程的创建和销毁,将消耗过多的系统资源,还增加了线程上下文(运行环境)切换的开销,而通过线程池技术就可以很好地解决这些问题。

        线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在处理完任务之后并不会销毁,而是把线程归还到线程池中,继续为后续的任务提供服务。

1.2 线程池的特点

1、线程复用:线程池会在内部维护一定数量的线程,并在需要时重复使用这些线程来执行任务,避免频繁地创建和销毁线程,从而提高性能和效率。

2、控制并发性:对于多核处理器,由于多线程被分配到多个处理器中,提高并行处理的效率。线程池可以控制并发执行的线程数量,通过设定线程池的大小来限制系统中同时执行的线程数量,避免资源的过度占用和线程竞争导致的性能下降。

3、任务排队:当线程池中的线程已经全部被占用时,新提交的任务会被放入一个任务队列中进行排队等待执行。排队机制可以根据具体线程池的实现,选择不同的队列类型,如有界队列或无界队列。

4、提高任务的响应速度,当任务到达时,不需要等待线程创建就能立即执行任务。

5、提供线程管理和监控:线程池提供了易于管理和监控线程的方式,可以设置线程的属性、监控线程的状态、统计任务执行情况等。

6、避免资源的过度消耗:线程池可以通过限制线程数量和排队机制来避免过度消耗资源。当系统负载过高时,线程池可以根据配置策略进行线程数量的自动调整,以保持系统的稳定性和性能。

7、提高任务执行的灵活性:线程池可以接受不同类型的任务,并对这些任务进行执行调度。它提供了一系列提交任务的方法,如execute()、submit(),同时还支持定时执行和周期性执行任务的能力。

1.3 按应用场景分类

1、FixedThreadPool:

固定线程池:线程池中的线程数量固定,这些线程会一直存在,不会随任务的增加或减少而动态调整,超出的任务会在队列中等待。

使用场景:任务量比较固定但耗时较长的任务。

2、CachedThreadPool:

缓存线程池:可根据需要创建新线程的线程池,如果新任务到达,但线程池中没有可用的线程,则创建一个新线程并添加到池中,如果有被使用完但是还没销毁的线程,就复用该线程。线程池中超过60s未使用的线程,将会被移除和销毁。

使用场景:任务量大但耗时少的任务。

3、WorkStealingPool:

工作窃取线程池:创建一个拥有多个任务队列(以便减少连接数)的线程池;

使用场景:会创建一个含有足够多线程的线程池,来维持相应的并行级别,它会通过工作窃取的方式,使得多核的CPU不会闲置,总会有活着的线程让CPU去运行。如果当前工作线程处理完自己本地任务队列中的任务时,就会去全局队列或其他工作线程的队列里面查找工作任务,帮助它们完成。利用Work Stealing,可以更好实现负载均衡。

4、ScheduledThreadPool:

计划线程池(定时线程池、调度线程池)

使用场景:定时以及周期性执行任务。

1.4 线程池模式

半同步/半异步模式又称为生产者消费者模式,是比较常见的实现方式,比较简单。分为同步层、队列层、异步层三层。同步层的主线程处理工作任务并存入工作队列,工作线程从同步队列取出任务进行处理,如果工作队列为空,则取不到任务的工作线程进入挂起状态。由于线程间有数据通信,因此不适用于大数据量交换的场合。

1.5 线程池实现的关键技术分析

        线程池由三层组成:同步服务层、排队层和异步服务层,其中排队层居于核心地位,因为上层会将任务添加到排队层中,异步服务层同时也会取出任务,这里有一个同步的过程。在实现时,排队层就是一个同步队列,允许多个线程同时去添加或取出任务,并且要保证操作过程是安全的。

        线程池有两个活动过程,一个是往同步队列中添加任务的过程,另一个是从同步队列中取出任务的过程。

         从活动图中可以看到线程池的活动过程,一开始线程池会启动一定数量的线程,这些线程属于异步层,主要用来并行处理排队层中的任务,如果排队层中的任务数为空,则这些线程等待任务的到来,如果发现排队层中有任务了,线程池则会从等待的这些线程中唤醒一个来处理新任务。

        同步服务层则会不断地将新的任务添加到同步排队中,有可能上层的任务非常多,而任务又是非常耗时的,这时,异步层中的线程处理不过来,则同步排队层中的任务会不断增加,如果同步排队层不加上限控制,则可能会导致排队层中的任务过多,内存暴涨的问题。因此,排队层需要加上限的控制,当排队层中的任务数达到上限时,就不让上层的任务添加进来,起到限制和保护的作用。

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

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

相关文章

Unity 编写自己的aar库,接收Android广播(broadcastReceiver)并传递到Unity

编写本文是因为找了很多文章,都比较片段,不容易理解,对于Android新手来说理解起来不友好。我这里写了一个针对比较小白的文章,希望有所帮助。 Android端 首先还是先来写Android端,我们新建一个Android空项目&#xf…

AI智能网关 边缘计算 视觉AI

随着人工智能技术的不断发展,AI智能网关正成为连接现实世界和虚拟智能世界的重要桥梁。作为智能化时代的关键设备,AI智能网关在物联网、工业、市政、无人驾驶、农业、环保、水利等领域起到了至关重要的作用。   首先,AI智能网关是物联网的核…

转行大模型成功进字节了!48k*15薪!

以ChatGPT为代表的大模型技术的出现,让算法工程师重新成了炙手可热的岗位。 现在国内各家大小厂都在搞大模型算法,投入了巨量的人力物力财力,都不愿意放弃这个百年难遇的机会,像字节,腾讯,京东等大厂也增加…

数学建模笔记(1):插值法

1.插值法的用途 在对数据进行处理的时候,我们往往会碰到由于数据量比较小的情况,这样的情况不利对数据进行分析。插值法就是是针对这种情况,模拟产生和原来数据相近的数据来为数据分析提供完整可靠的数据。 总结:插值法是一种自己…

RAG应用深度解析:文件解析与内容提取的技术突破

在了解完[# 落地RAG系列:RAG入门及RAG面临的挑战和解决方案!!]Naive RAG工作流程以及Naive RAG存在的问题后,我们将先从离线部分的文件解析开始技术分析与落地,朝着高级RAG的方向前进! 文件解析的难点 在R…

Keepalived 高可用集群详解和配置

Keepalived 高可用集群 集群类型 1、LB(Load Balance):负载均衡 LVS:四层负载均衡 HAProxy:七层/四层 负载均衡 nginx:七层负载均衡 (http/upstream,stream/upstream) 2、HA(High Availa bili…

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…

交通拥堵辅助与自动化

Traffic-Jam Assistance and Automation 交通拥堵辅助与自动化 Abstract Traffic jams are situations where a high degree of automation could give a large benefit to customers. In addition, the relatively simple situation of a traffic jam means that a high deg…

使用pytest+selenium编写网页UI自动化脚本和用例

1 UI自动化测试 UI自动化测试(User Interface Automation Testing)是一种通过编写脚本或使用自动化测试工具,对界面(UI)进行自动化测试的方法。原理主要是模拟用户打开客户端或网页的UI界面,自动化执行用户…

C语言学习——函数(数组作为函数参数)

目录 8.7数组作为函数参数 数组元素作函数实参 数组名作参数函数 8.7数组作为函数参数 我们知道可以用变量作函数参数,显然,数组元素也可以作函数实参,其用法与变量相同。此外,数组名也可以作实参和形参,传递的是数…

【区块链教程】如何使用自动化脚本创建小狐狸地址

在很多场景下,不管是撸毛也好,批量操作也好,都需要使用到大量的qianbao地址。 如何一键创建,也成为了很多人想学的技术。 创建地址的自动化脚本可以极大地简化在区块链开发和测试中的管理流程。以下是一个基本的流程和示例脚本&am…

知识竞赛中必答题环节竞赛规则有哪些设计方案

必答题环节被广泛用到各类知识竞赛活动中,往往被安排在第一环节,是知识竞赛中的热身环节。那么,常用的必答题环节规则应怎么设计呢?下面列出的这些大家可以参考一下。 1.可以分个人必答题和团队必答题。个人必答题可以分别记个人…

为什么要用static

前言 本文主要介绍C/C中的static,以及为什么要用static,别人的代码中有时会突然使用用static,看的一脸蒙圈,为什么要用static,我不用难道不行吗?对啊为什么呢? 正文 static是C/C中一个很重要…

浅试扫雷游戏(简易版)

目录 1. 扫雷游戏分析和设计 1)扫雷游戏的功能说明 2)游戏的分析和设计 2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1)扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子…

“前缀和”专题篇二

目录 和为K的子数组 和可被K整除的子数组 连续数组 矩阵区域和 和为K的子数组 题目 思路 我们可能想到的是,从头到尾扫描数组,然后分别计算以该位置为开始,一直到数组末尾,符合和为K的子数组,但是这种方法的时间复…

线上研讨会 | CATIA助力AI提升汽车造型设计

报名链接: 2024探索之旅第二季

Linux Shell基础常用脚本命令及应用案例

文章目录 常用的 Shell 命令1. 变量2. 注释3. 输出4. 输入5. 条件判断6. 循环7. 函数8. 运算9. 流程控制10. 文件和目录操作11. 错误处理 Shell 脚本应用案例1. Hello World 脚本2. 创建系统账户及设置密码3. 日志文件备份4. 一键部署 LNMP 环境5. 检查磁盘空间6. 自动安装软件…

Nginx反向代理的使用场景

Nginx Vue使用npm命令打包:npm run build Nginx的定位:主要用于做反向代理,一般都是用它来做前端页面的服务器,动态资源代理到后端服务器。这样做的好处是可以避免跨域请求带来的不便。 我们知道,在前端我们开发的时…

三、AI工作流(低代码)的趋势即将崛起,输入-按钮组件详解,带你轻松玩转按钮组件

对工作流感兴趣的小伙伴可以去试一试。🔥偷偷的告诉你,它的GPTo4.0 不要💰。传送门:https://www.nyai.chat/chat?invitenyai_1141439 一、能用AI工作流介绍 能用AI-工作流是一个“低代码”工具、它也是个人或者中小企业的提效工…

C#语言基础速成Day07

“知止而后有定&#xff0c;定而后能静&#xff0c;静而后能安&#xff0c;安而后能虑&#xff0c;虑而后能得。” 目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day07 C#常见数据结构&#xff1a;1. 集合&#xff08;Collection&#xff09;1.1 **List<T>**1.2 **H…