阻塞队列实现

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

阻塞队列

  • 1. 什么是阻塞队列
  • 2. 标准库中的阻塞队列
  • 3. 模拟实现

1. 什么是阻塞队列

阻塞队列是⼀种特殊的队列,遵守 “先进先出” 的原则。

阻塞队列能是⼀种线程安全的数据结构,并且具有以下特性:

  • 当队列满的时候,继续⼊队列就会阻塞,直到有其他线程从队列中取⾛元素。
  • 当队列空的时候,继续出队列也会阻塞,直到有其他线程往队列中插⼊元素。

阻塞队列的⼀个典型应⽤场景就是 “⽣产者消费者模型”。这是⼀种⾮常典型的开发模型。

生产者消费模型:
⽣产者消费者模式就是通过⼀个容器来解决⽣产者和消费者的强耦合问题。
⽣产者和消费者彼此之间不直接通讯,⽽通过阻塞队列来进⾏通讯,所以⽣产者⽣产完数据之后不⽤等待消费者处理,直接扔给阻塞队列,消费者不找⽣产者要数据,⽽是直接从阻塞队列⾥取

  1. 阻塞队列就相当于⼀个缓冲区,平衡了⽣产者和消费者的处理能力
  2. 阻塞队列也能使⽣产者和消费者之间解耦

2. 标准库中的阻塞队列

在 Java 标准库中内置了阻塞队列。如果我们需要在⼀些程序中使⽤阻塞队列,直接使⽤标准库中的即可。
在这里插入图片描述

  • BlockingQueue 是⼀个接⼝,真正实现的类是 LinkedBlockingQueue
  • put ⽅法⽤于阻塞式的⼊队列,take ⽤于阻塞式的出队列
  • BlockingQueue 也有 offer, poll, peek 等⽅法,但是这些⽅法不带有阻塞特性

示例:

public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue=new ArrayBlockingQueue<>(100);queue.put("aaa");//入队列--有阻塞功能的String elem=queue.take();//出队System.out.println(elem);//aaa
}

3. 模拟实现

方法

  1. 先实现普通队列–使用数组实现循环队列,保证实现出入队列的操作
  2. 加上线程安全–synchronized
  3. 加上阻塞队列
//模拟实现
class MyBlockingQueue{private String[] elems=null;//数组实现队列private int head=0;//队首private int tail=0;//队尾private int size=0;//元素个数private  Object loker=new Object();//锁对象public MyBlockingQueue(int capacity){elems=new String[capacity];}//入队列public void put(String elem) throws InterruptedException {//有读写操作的synchronized (loker) {//队列满了,进入阻塞while(size >= elem.length()) {loker.wait();}elems[tail] = elem;//新元素放入tail位置上tail++;//tail=tail%elems.length;if (tail >= elems.length) {tail = 0;//循环对列}size++;//当队列为空,只要有元素入队列就唤醒下面的waitloker.notify();}}//出队列public String take() throws InterruptedException {String tmp =null;synchronized (loker) {//队列为空while(size == 0) {loker.wait();}tmp = elems[head];head++;if (head >= elems.length) {head = 0;}size--;//当队列满了,只要有元素出队列就唤醒前面的入队列loker.notify();}return tmp;}
}

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

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

相关文章

graphql入门_GraphQL入门指南

graphql入门by Leonardo Maldonado莱昂纳多马尔多纳多(Leonardo Maldonado) GraphQL入门指南 (A Beginner’s Guide to GraphQL) One of the most commonly discussed terms today is the API. A lot of people don’t know exactly what an API is. Basically, API stands fo…

leetcode 239. 滑动窗口最大值(单调队列)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出…

scrape创建_确实在2分钟内对Scrape公司进行了评论和评分

scrape创建网页搜罗&#xff0c;数据科学 (Web Scraping, Data Science) In this tutorial, I will show you how to perform web scraping using Anaconda Jupyter notebook and the BeautifulSoup library.在本教程中&#xff0c;我将向您展示如何使用Anaconda Jupyter笔记本…

ArcGIS自定义高程

没写呢。 转载于:https://www.cnblogs.com/jiangyuanjia/p/11220183.html

Java基础——String类(一)

一、String 类代表字符串 Java 程序中的所有字符串字面值&#xff08;如 "abc" &#xff09;都作为此类的实例实现。 字符串是常量&#xff1b;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的&#xff0c;所以可以共享。例如…

java jol原理_Java对象布局(JOL)实现过程解析

java对象布局JOL(java object layout),描述对象在堆内存的布局。如下图&#xff1a;1.markword 固定长度8byte&#xff0c;描述对象的identityhashcode&#xff0c;分代年龄&#xff0c;锁信息等(https://www.jb51.net/article/183984.htm)&#xff1b;2.klasspoint 固定长度4b…

数据库维护相关

&#xff08;1&#xff09;SQL Server 查看数据表使用空间 exec sp_spaceused 表名 &#xff08;2&#xff09;SQL Server 数据表使用空间排序 exec sp_MSForeachTable precommandN create table ##( table_name sysname, records int, save_space Nvarchar(10), use_space var…

Redux初学者指南

by Safeer Hayat通过更安全的哈亚特 Understanding Redux as a beginner can be quite confusing. Redux has an abundance of new terms and concepts which are often pretty unintuitive. This guide presents a very simplified example of a Redux implementation. I wil…

leetcode 86. 分隔链表(链表)

给你一个链表和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例&#xff1a; 输入&#xff1a;head 1->4->3->2->5->2, x 3 输出&am…

极光推送

推送原理 IOS 通过APNs推送服务。 每个设备只要保持一个与APNs的常链接&#xff0c;服务器将要推送的消息发送给APNs&#xff0c;APNs再将消息转发到响应的手机&#xff0c;手机内置的程序再进行分发&#xff0c;到响应的APP&#xff0c;就能很好的实现推送功能 Andriod 虽然谷…

电脑通过手机上网的方法

(适用于包月CMWAP无限流量服务,只收CMWAP费用)移动手机(GPRS) CMWAP无限流量包月服务&#xff0c;可以通过手机作调制解调器&#xff0c;将手机和电脑连接用代理服务器上网. 看到了很多帖子&#xff0c;整理了一下&#xff0c;把它贴出来供大家参考。一 该方法对手机要求:1 手…

java入门学习_Java入门学习进阶知识点

Java入门学习进阶知识点入门阶段&#xff0c;主要是培养Java语言的编程思想。了解Java语言的语法&#xff0c;书写规范等&#xff0c;掌握Eclipse、MyEclipse等开发工具&#xff0c;编写Java代码的能力。学完这个阶段你应该可进行小型应用程序开发并且可以对数据库进行基本的增…

如何不认识自己

重点 (Top highlight)By Angela Xiao Wu, assistant professor at New York University纽约大学助理教授Angela Xiao Wu This blog post comes out of a paper by Angela Xiao Wu and Harsh Taneja that offers a new take on social sciences’ ongoing embrace of platform …

JDBC 数据库连接操作——实习第三天

今天开始了比较重量级的学习了&#xff0c;之前都是对于Java基础的学习和回顾。继续上篇的话题&#xff0c;《谁动了我的奶酪》&#xff0c;奉献一句我觉得比较有哲理的话&#xff1a;“学会自嘲了,而当人们学会自嘲,能够嘲笑自己的愚蠢和所做的错事时,他就在开始改变了。他甚至…

webassembly_WebAssembly的设计

webassemblyby Patrick Ferris帕特里克费里斯(Patrick Ferris) WebAssembly的设计 (The Design of WebAssembly) I love the web. It is a modern-day superpower for the dissemination of information and empowerment of the individual. Of course, it has its downsides …

leetcode 509. 斐波那契数(dfs)

斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1 给你 n &a…

java基本特性_Java面试总结之Java基础

无论是工作多年的高级开发人员还是刚入职场的新人&#xff0c;在换工作面试的过程中&#xff0c;Java基础是必不可少的面试题之一。能不能顺利通过面试&#xff0c;拿到自己理想的offer&#xff0c;在准备面试的过程中&#xff0c;Java基础也是很关键的。对于工作多年的开发人员…

plotly python_使用Plotly for Python时的基本思路

plotly pythonI recently worked with Plotly for data visualization on predicted outputs coming from a Machine Learning Model.我最近与Plotly合作&#xff0c;对来自机器学习模型的预测输出进行数据可视化。 The documentation I referred to : https://plotly.com/pyt…

转发:毕业前的赠言

1、找一份真正感兴趣的工作。 “一个人如果有两个爱好&#xff0c;并且把其中一个变成自己的工作&#xff0c;那会是一件非常幸福的事情。那么另外一个爱好用来做什么&#xff1f;打发时间啦。所以&#xff0c;第二个兴趣非常重要&#xff0c;在你无聊寂寞的时候越发显得它…

Python模块之hashlib:提供hash算法

算法介绍 Python的hashlib提供了常见的摘要算法&#xff0c;如MD5&#xff0c;SHA1等等。 什么是摘要算法呢&#xff1f;摘要算法又称哈希算法、散列算法。它通过一个函数&#xff0c;把任意长度的数据转换为一个长度固定的数据串&#xff08;通常用16进制的字符串表示&#xf…