阻塞队列和线程池

一、什么是阻塞队列

1.1 什么是队列

队列是先进先出。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

1.2 什么是阻塞队列?

队列已经满的时候,往队列塞数据的时候阻塞

队列为空的时候,往外拿取元素的时候阻塞

1.3 BlockQueue

阻塞方法:

take():E    队列为空的时候,发生阻塞

put(E): 往队列满的时候,往队列插数据发生阻塞

非租塞方法:

二、阻塞队列的使用场景

生产者-消费者模式

2.1 作用

平衡生产者和消费者性能均衡问题。(背压)

2.2 常见的阻塞队列

  • ArrayBlockingQueque: 一个由数组结构组成的有界阻塞队列
  • LinkedBlockingQueque: 一个由链表组成的有界阻塞队列
  • PriorityBlockingQueque: 一个支持优先级排序的无界阻塞队列,放入元素按照优先级排序
  • DelayQueue: 一个使用优先级队列组成的无界阻塞队列,放入的元素要支持Delay接口。元素的剩余时间没到的话,拿不到元素。
  • SynchronousQueue: 一个不存在元素的阻塞队列,将生产者元素直接交给消费者
  • LinkedTransferQueue: 一个由链表组成的无界阻塞队列,往队列中放入元素的话,如果有消费者在等待,直接交给消费者,而不需要放入队列。
  • LinkedBlockingDeque: 一个由链表组成的双向阻塞队列

2.3 什么是有界?

有界:队列长度是有限的,满了以后生产者就会阻塞

无界:队列长度是无限的,可以不停的往里添加东西而不会阻塞

三、线程池

3.1 什么是线程池?

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。它由线程池管理器、工作队列和线程池线程组成。

线程池的基本概念是,在应用程序启动时创建一定数量的线程,并将它们保存在线程池中。当需要执行任务时,从线程池中获取一个空闲的线程,将任务分配给该线程执行。当任务执行完毕后,线程将返回到线程池,可以被其他任务复用

3.2 为什么使用线程池?

好处:

  • 重用线程

线程池会在内部维护一组可重用的线程,避免了频繁地创建和销毁线程的开销,提高了线程的利用率。 创建线程需要资源,切换上下文开销大。

  • 控制并发度

线程池可以限制并发执行的线程数量,防止系统过载。通过调整线程池的大小,可以控制并发度,避免资源消耗过大。

  • 提供线程管理和监控

线程池提供了一些管理和监控机制,例如线程池的创建、销毁、线程状态的监控等,方便开发人员进行线程的管理和调试。

  • 提供任务队列

线程池通常会使用任务队列来存储待执行的任务,这样可以实现任务的缓冲和调度。

缺点:

1) 需要合理配置:线程池的性能和效果受到配置参数的影响,需要根据具体的应用场景和硬件环境来合理配置线程池的大小、任务队列的大小等参数。
2)可能引发资源泄露:如果线程池中的线程长时间闲置而不被使用,可能会导致资源的浪费和泄露。
3)可能引发死锁:在使用线程池时,如果任务之间存在依赖关系,可能会引发死锁问题,需要额外的注意和处理。

3.3 线程池工作机制

ThreadPoolExcutor

3.3.1 线程池的参数

corePoolSize: 线程池的核心线程数。

maxinumPoolSize: 最大线程数。线程池所能够使用的最大线程数量

keepAliveTime+TimeUnit: 空闲线程的存活时间

workQueue:BlockingQueue: 工作任务的缓存阻塞队列

RejectExecutionHandler: 拒绝策略。超出线程池能力的任务的处理策略。

3.3.2 工作原理

1)用户往线程池提交任务。当前启动的工作线程数小于核心线程数,则创建一个新的工作线程吹任务;

2)如果工作线程数已经大于核心线程数,则会将工作任务放入阻塞队列中。

3)如果阻塞队列已经填满,如果工作线程数小于最大线程数,则新启动一个线程处理工作任务;

4)如果最大线程数也满了,则使用拒绝策略。

 3.3.3 四种拒绝策略

DiscardOldestPolicy: 丢弃最老的任务

AbortPolicy: 直接抛出异常。默认

CallerRunsPolicy: 调用者执行任务。

DiscardPolicy: 丢弃最新提交的任务

3.4 提交任务的方式

execute: 提交任务给线程池,不关心返回结果。

submit: 提交任务并且得到返回值

3.5 线程池关闭

shutdown: 

shutdownNow:

3.6 合理配置线程池

任务特性:

CPU密集型:大量的CPU运算,核心线程数最好CPU核心数+1

IO密集型:网络通讯、读写IO。核心线程数可以设置 CPU核心数*2

混合型:既有CPU密集型任务,也有IO密集型任务。

 “计算密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。”

参考文献:

https://blog.csdn.net/mcband/article/details/136606199

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端自测 - 那些经典的bug

前言 我一直坚持的一个观点,就是不以bug数论成败,但是这个需要加一个前提,就是不能出现那些低级的bug,更不能反复的出现。 由此整理了一系列我认为比较经典常见的前端bug,都是在项目中多次遇到过的,用于前…

Golang Context详解

文章目录 基本介绍context源码剖析Context接口emptyCtxcancelCtxtimerCtxvalueCtx context使用案例协程取消超时控制数据共享 基本介绍 基本介绍 在Go 1.7版本中引入了上下文(context)包,用于在并发编程中管理请求范围的数据、控制生命周期、…

vue-router全部搞定(附源码)

源码下载链接(先转存,后下载):https://pan.quark.cn/s/b0c6edd68c21 怎么用vue-cli搭建项目 我们固然可以用传统htmljs的方式来搭建vue项目,但是如果组件很多,就需要通过Vue.component的方式一个个去引入…

Python的else子句7个妙用,原来还能这样用,整挺好!

## 1、条件语句else基础 🔄 1.1 简单else的常规操作 在Python中,else子句通常跟在if或一系列if-elif之后,提供一个“否则”的情况处理路径。如果前面的所有条件都不满足 ,程序就会执行这里的代码块。例如 ,检查一个数…

【STM32】GPIO输出(江科大)

一、GPIO简介 1.GPIO:通用输入输出口 2.可配置为8种输入输出模式 3.引脚电平:0-3.3V(输出最大3.3V),部分引脚可容忍5V(输入,有FT) 4.输出模式下,可控制端口输出高低电平…

详解FedProx:FedAvg的改进版 Federated optimization in heterogeneous networks

FedProx:2020 FedAvg的改进 论文:《Federated Optimization in Heterogeneous Networks》 引用量:4445 源码地址: 官方实现(tensorflow)https://github.com/litian96/FedProx 几个pytorch实现:…

十二、【源码】配置注解执行SQL

源码地址:https://github.com/mybatis/mybatis-3/ 仓库地址:https://gitcode.net/qq_42665745/mybatis/-/tree/12-annotation 配置注解执行SQL 简化一下流程,主要可以分为下面几步: 1.解析配置,写入配置项 2.执行…

问题排查: Goalng Defer 带来的性能损耗

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言问题背景结论 引言 性能优化之路道阻且长,因为脱敏规定,…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中,正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例: 当涉及正则表达式时,理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子: ^&#xff1…

讯飞星火大模型个人API账号免费使用申请教程

文章目录 1.登录讯飞星火大模型官网 https://www.xfyun.cn/ 2.下滑找到Spark Lite,点击立即调用 3.星火大模型需要和具体的应用绑定,我们需要先创建一个新应用 https://console.xfyun.cn/app/myapp,应用名称可以按照自己的意愿起。 4.填写应用…

打造智慧工厂核心:ARMxy工业PC与Linux系统

智能制造正以前所未有的速度重塑全球工业格局,而位于这场革命核心的,正是那些能够精准响应复杂生产需求、高效驱动自动化流程的先进设备。钡铼技术ARMxy工业计算机,以其独特的设计哲学与卓越的技术性能,正成为众多现代化生产线背后…

ViT:2 理解CLIP

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

vuInhub靶场实战系列--Kioptrix Level #3

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

快速测试 Mybatis 复杂SQL,无需启动 Spring

快速测试mybatis的sql 当我们写完sql后,我们需要测试下sql是否符合预期,在填入各种参数后能否正常工作,尤其是对于复杂的sql。 一般我们测试可能是如下的代码: 由于需要启动spring,当项目较大的时候启动速度很慢,有些…

④-2单细胞学习-cellchat单数据代码补充版(通讯网络)

目录 通讯网络系统分析 ①社会网络分析 1,计算每个细胞群的网络中心性指标 2,识别细胞的信号流模式 ②非负矩阵分解(NMF)识别细胞的通讯模式 1,信号输出细胞的模式识别 2,信号输入细胞的模式识别 信…

RocketMq源码解析六:消息存储

一、消息存储核心类 rocketmq消息存储的功能主要在store这个模块下。 核心类就是DefaultMessageStore。我们看下其属性 // 配置文件 private final MessageStoreConfig messageStoreConfig; // CommitLog 文件存储实现类 private final CommitLog commitLog; …

【研发日记】Matlab/Simulink软件优化(三)——利用NaNFlag为数据处理算法降阶

文章目录 前言 背景介绍 初始算法 优化算法 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 见《【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法》 背景介绍 在一个嵌入式软件开发项目中,需要开…

FedAvg论文

论文:Communication-Efficient Learning of Deep Networks from Decentralized Data 原code Reproducing 通过阅读帖子进行的了解。 联邦平均算法就是最典型的平均算法之一。将每个客户端上的本地随机梯度下降和执行模型的平均服务器结合在一起。 联邦优化问题 数…

开发小Tips:切换淘宝,腾讯,官方,yarn,cnpm镜像源,nrm包管理工具的具体使用方式(方便切换镜像源)

由于开发中经常要下载一些软件或者依赖,且大多数的官方源的服务器都在国外,网速比较慢,国内为了方便,国内一些大厂就建立一些镜像,加快下载速度。 1.各大镜像源的切换: 切换淘宝镜像源: npm …

Bio-Info每日一题:Rosalind-06-Counting Point Mutations

🎉 进入生物信息学的世界,与Rosalind一起探索吧!🧬 Rosalind是一个在线平台,专为学习和实践生物信息学而设计。该平台提供了一系列循序渐进的编程挑战,帮助用户从基础到高级掌握生物信息学知识。无论你是初…