阻塞队列和线程池

news2024/9/20 23:26:30

一、什么是阻塞队列

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

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

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

相关文章

数据可视化Python实现超详解【数据分析】

各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

0元白嫖阿里云4G内存云服务器——感谢伟大的CSDN和阿里云

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程-CSDN博客 目录 1、学生认证领取300元优惠券 ​2、购买云服务器 1、学生认证领取…

Upscayl:款利用人工智能技术,深度学习算法,实现图像无损放大和增强的强大工具。

Upscayl AI: Upscayl AI是一款基于先进的人工智能技术,特别是深度学习算法开发的图像增强工具。它能够智能地分析并改善图像质量,实现无损放大、细节重建和模糊消除,让老旧、低分辨率或模糊的照片焕发新生,达到高清画…

【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题

文章目录 1 前言2 导包导入数据集3 创建多路图,导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络,先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频(BV1LY411R7HJ)&#…

自动驾驶跟驰仿真

联合仿真需求分析报告 一、项目背景 随着汽车技术的快速发展,自动驾驶和智能网联汽车已成为行业发展的重要趋势。为确保自动驾驶车辆在复杂交通环境中的安全性和可靠性,进行联合仿真测试显得尤为重要。本报告旨在明确联合仿真的具体需求,为…

基本表的定义:创建表、修改表、删除表

一、创建数据库与打开数据库 学生选课数据库 学生(学号,姓名,性别,出生时间,所在系) 课程(课程编号,课程名,先修课程号) 选课(学号&#xff0…

浅析Vue3 实战笔记(一)

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 有问题欢迎指正!! 前面已经讲了基本的Vue生命周期和入门知识,本篇开始使用Vite构建一个demo 1. 创建项目 1.1. 初始化项目 使用Vite初始化项目 yarn create v…

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况,程序在执行过程中,数据导致程序不正常,最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分,比如我们比较熟悉的数组越…

【C++11】常见的c++11新特性(一)

文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…

两台电脑通过网线直连共享数据(超详细)- 我的实践记录

原文链接 按照原文的操作,成功通过直连网线连接了两台windows电脑并共享传输数据。 ping不通可能是防火墙没关闭导致的,但是完全关闭防火墙又不安全。 那么有没有不关闭防火墙,能够上网,又能直连另一台电脑呢? 我们…

tokenization(一)概述

文章目录 背景基于词(Word-based)基于字符(Character-based)子词词元化(Subword tokenization) 背景 tokenization是包括大语言模型在内所有自然语言处理的任务的基础步骤,其目标是将文本数据转…

数据结构:二叉树的实现

目录 二叉树的遍历方式 前序遍历: 中序遍历: 后序遍历: 二叉树的基本结构和功能 基本结构: 基本功能: 二叉树功能的实现思路 二叉树功能的实现 1、构建一个二叉树 2、二叉树的销毁 3、计算二叉树里的节点个数 4、得…

音频数据上的会话情感分析

情感分析,也被称为观点挖掘,是自然语言处理(NLP)中一个流行的任务,因为它有着广泛的工业应用。在专门将自然语言处理技术应用于文本数据的背景下,主要目标是训练出一个能够将给定文本分类到不同情感类别的模型。下图给出了情感分类器的高级概述。 例如,三…

从零开始理解AdaBoost算法:设计思路与算法流程(二)【权值更新与加权表决、数学公式】

设计思路 AdaBoost算法属于Boosting算法家族中的一种,其基本思路是将多个弱分类器组合成一个强分类器。 “强分类器”是指一个分类准确率较高的模型“弱分类器”则是指分类准确率略高于随机猜测的简单模型。 AdaBoost的核心思想是通过 加权 的方式逐步提高分类器…

Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)

Tomcat源码系列文章 Tomcat源码解析(一):Tomcat整体架构 Tomcat源码解析(二):Bootstrap和Catalina Tomcat源码解析(三):LifeCycle生命周期管理 Tomcat源码解析(四):StandardServer和StandardService Tomcat源码解析(五)&…

keda-P0460. 潜水员

可达信奥 - 登录 - 可达信奥https://kedaoi.cn/p/P0460 代码思路: 01背包DP。 思路也是比较经典的,就是看用这个水缸的最小值小,还是不用这个水缸的最小值小。但是这里涉及到一个初始化的问题,因为要求最小所以初始化理应…

使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端

要使用NetAssist网络调试助手在同一台计算机上配置一个实例作为服务器(server)和另一个实例作为客户端(client),可以按照以下步骤进行操作: 前提条件 确保已经安装NetAssist网络调试助手,并了…

streamlit:如何快速构建一个应用,不会前端也能写出好看的界面

通过本文你可以了解到: 如何安装streamlit,运行起来第一个demo熟悉streamlit的基本语法,常用的一些组件使用streamlit库构建应用 大模型学习参考: 大模型学习资料整理:如何从0到1学习大模型,搭建个人或企业…

鞠小云张霖浩闪耀北京广播电视台春晚发布会,豪门姐弟感爆棚

昨日,2025年北京广播电视台“追梦春晚”全国海选发布会在杭州举行,中国内地青年女演员鞠小云同人气幕后张霖浩,受主办方盛情邀请出席本次活动。从现场流露出的照片中可以看出,鞠小云一袭白色长裙灵动温婉素雅,而张霖浩…