阻塞队列介绍

阻塞队列

kafka是目前来说性能最好的消息队列服务器,能处理TB级别的数据

作用:点赞、评论时,服务器会自动给某个用户发送通知

kafka是个框架,如果不用框架还要解决类似问题,就要用到阻塞队列

BlockingQueue

阻塞队列就是一个接口BlockingQueue,java核心API中的接口

  • 作用:解决线程通信的问题。

    wait/notify等也可以解决线程通信问题,但更加麻烦,因此如果要在API中选一种方法解决线程通信问题,选择阻塞队列更好

  • 阻塞方法:put、take。

  • 生产者消费者模式

    • 生产者:产生数据的线程。
    • 消费者:使用数据的线程。

    假设线程1为生产者,线程2为消费者,两线程直接打交道可能产生问题:

    • 生产速度过快,远快于消费速度。当线程2不再需要数据后,线程1没有被阻塞,仍在占用cpu生产,造成资源浪费

    • 生产速度很慢,赶不上消费速度。当线程2把数据使用完后,没有被阻塞,仍占用着cpu获取数据,但取不到,也造成系统资源浪费

    BlockingQueue就是在生产者和消费者之间搭建了一个桥梁,构造一个缓冲空间,可避免两线程直接打交道。

    线程1用put方法往队列里存数据,线程2用take方法从队列中取数据。故线程1为生产者,线程2为消费者。

    线程1将生产的数据放在队列里,若队列未满,则继续生产;若队列满了,线程1就会被阻塞

    线程2从队列中取数据,若队列不空,则继续取;若队列为空,线程2被阻塞

    阻塞:等着,什么也不做,不会占用cpu资源,对系统性能没有影响。

    image-20240221211704412

BlockingQueue的实现类

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue、SynchronousQueue、DelayQueue等

阻塞队列代码实例

public class BlockingQueueTests {public static void main(String[] args) {// 构造容量为10的阻塞队列BlockingQueue queue = new ArrayBlockingQueue(10);// 创建一个生产者线程,并启动new Thread(new Producer(queue)).start();// 创建多个消费者线程,并启动new Thread(new Consumer(queue)).start();new Thread(new Consumer(queue)).start();new Thread(new Consumer(queue)).start();}}// 生产者类,用于构造生产者线程
class Producer implements Runnable {// 要求调用方在调用生产者线程时,要将阻塞队列传入,因为线程是要交给阻塞队列去管理的private BlockingQueue<Integer> queue;// 阻塞队列:通过泛型声明阻塞队列中存什么// 有参构造器:实例化时传入阻塞队列public Producer(BlockingQueue<Integer> queue) {this.queue = queue;}@Overridepublic void run() {try {// 生产者每隔20s生产一次数据,一共生产100次,将数据交给队列管理for (int i = 0; i < 100; i++) {Thread.sleep(20);queue.put(i);// 打印: 哪个线程在生产,生产后阻塞队列中有多少个数System.out.println(Thread.currentThread().getName() + "生产:" + queue.size());}} catch (Exception e) {e.printStackTrace();}}}// 消费者
class Consumer implements Runnable {private BlockingQueue<Integer> queue;public Consumer(BlockingQueue<Integer> queue) {this.queue = queue;}@Overridepublic void run() {try {// 消费者只要有数据就一直消费while (true) {// 消费者消费数据的时间间隔不是确定的,不能写死// 大概率生成的随机数比20大,即大概率生产速度快于消费速度Thread.sleep(new Random().nextInt(1000));// 弹出队首数据queue.take();// 打印:消费者是谁.消费后阻塞队列里有多少数据System.out.println(Thread.currentThread().getName() + "消费:" + queue.size());}} catch (Exception e) {e.printStackTrace();}}
}

一些选择题

5.2【瑞客论 坛 www.ruike1.com】

A

5.3【瑞客论 坛 www.ruike1.com】

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

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

相关文章

AI加速引擎PAI-TorchAcc:整体介绍与性能概述

作者&#xff1a;沈雯婷、黄奕桐、艾宝乐、王昂、李永 1、简介 PAI-TorchAcc(Torch Accelerator)是阿里云人工智能平台开发的Pytorch上的大模型训练加速框架。 PAI-TorchAcc提供了一套基于Pytorch的简洁、易用的接口&#xff0c;无需进行模型转换就可以无缝地接入HuggingFac…

Vue+OpenLayers7入门到实战目录

前言 本篇作为《VueOpenLayers7入门到实战》所有文章的二合一汇总目录&#xff0c;方便查找。 本专栏源码是由OpenLayers7.x版本结合Vue框架编写。 本专栏从Vue搭建脚手架到如何引入OpenLayers7依赖的每一步详细新手教程&#xff0c;再到通过各种入门案例和综合性的实战案例&a…

基于springboot+vue的体育馆管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

已经连接过github远程库,如何再次推送及删除远程库的内容

基于上次将文件推送到已经建好的github远程库上&#xff0c;此篇文章主要介绍如何再次推送文件去直接已经连接过的远程库&#xff0c;以此如何删除远程库中不想要的文件。 一、推送文件到远程库 1.将所需推送的文件拉入本地库所建的文件夹下&#xff1a;{ex&#xff1a;JVM相…

java面试(消息队列MQ)

MQ有什么用&#xff1f;有哪些场景&#xff1f; MQ&#xff08;MessageQueue&#xff09;消息队列。队列&#xff08;FIFO&#xff09;先进先出的数据结构&#xff0c;消息由生产者发送到MQ&#xff0c;后由消费者对消息进行处理。QQ&#xff0c;微信就是MQ场景。 MQ作用&…

搜索准确性提升 20%,Jina Reranker 成为 RAG 优化的新标杆!

在整合大型语言模型&#xff08;LLM&#xff09;到业务流程时&#xff0c;企业经常会遇到一些头疼的问题&#xff0c;比如怎样保持数据时效性、避免幻觉现象&#xff0c;以及如何保护数据安全等等。为了解决这些问题&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术应…

盘点国内大厂的10个AI创作工具,看看你都用过哪些?

国内大厂的 AI 创作工具&#xff0c;目前已经非常多了&#xff0c;而且有很多都是大家耳熟能详的。 下面整理了一些&#xff0c;包含 AI 绘画、AI 视频、AI 智能体、AI 大模型等多个方向的国内大厂 AI 创作工具。 发现有几款 AI 工具&#xff0c;还真的非常好用。看看这些 AI…

深入浅出Redis(三):Redis数据的存储、删除以及淘汰

引言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 本篇文章不像以往文章围绕Redis某个特点来讲解&#xff0c;而是作为过渡介绍&#xff0c;来说一说Redi…

基于springboot的大型商场应急预案管理系统论文

大型商场应急预案管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个计算机管理大型商场应急…

软件测试开发环境、测试环境、准生产环境、生成环境

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0…

如何器测试IP池的质量?代理IP是怎么在问卷调查中应用的呢?

在数字时代&#xff0c;数据收集和分析变得日益重要&#xff0c;而问卷调查作为一种常见的数据收集工具&#xff0c;其效率和准确性直接影响着研究的可信度和有效性。为了实现这一目标&#xff0c;代理IP在问卷调查中的应用变得愈发关键。本文旨在探讨如何测试IP池的质量&#…

真机测试——关于荣耀Magic UI系列HBuilder真机调试检测不到解决办法

​​​​​出现这种状况怎么办 1、开启USB调试 2、重点来了——我们要选择USB配置&#xff0c;选择音频来源 3、连接OK

vue3基础教程(2)——创建vue3+vite项目

博主个人微信小程序已经上线&#xff1a;【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 前言2.node版本检测3.创建vue项目 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。 零基础读者也能成功由本系列文章入门&#x…

javascript数组排序的方法

目录 基本用法 按照数字大小排序 按照降序排序 按照字符串长度排序 按照对象属性排序 在JavaScript中&#xff0c;数组排序通常使用Array.prototype.sort()方法。这个方法会按照指定的顺序对数组的元素进行排序&#xff0c;并返回排序后的数组。如果未指定比较函数&#x…

Springboot配置MySQL数据库

Springboot配置MySQL数据库 一、创建springboot项目&#xff0c;并添加如下依赖 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency>二、在applica…

基于springboot+vue的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

实现session共享的方法总结完整版

文章目录 实现session共享的方法总结完整版1、使用共享数据库&#xff1a;2、使用粘性会话&#xff08;Sticky Session&#xff09;&#xff1a;3、使用缓存系统&#xff1a;4、使用分布式文件系统&#xff1a;5、使用中央认证服务&#xff1a;6、使用会话复制&#xff1a;7、使…

100%开源大模型OLMo:代码/权重/数据集/训练全过程公开,重定义AI共享

前言 近日&#xff0c;艾伦人工智能研究所联合多个顶尖学术机构发布了史上首个100%开源的大模型“OLMo”&#xff0c;这一举措被认为是AI开源社区的一大里程碑。OLMo不仅公开了模型权重&#xff0c;还包括了完整的训练代码、数据集和训练过程&#xff0c;为后续的开源工作设立…

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H&#xff0c;这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽&#xff0c;并拥有36GB的存储容量&#xff0c;相较于之前的8层堆叠HBM3 8H&#xff0c;在带宽和…

ECMAScript6

课程链接 目录 相关介绍什么是ECMA什么是ECMAScript为什么学习ES6 letconst变量解构赋值模板字符串对象简化写法箭头函数函数参数的默认值rest参数扩展运算符Symbol迭代器生成器函数与调用Promise介绍与基本用法Promise封装读取文件Promise.prototype...then方法Promise.catch…