阻塞队列实现

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏: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,一经查实,立即删除!

相关文章

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笔记本…

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…

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

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

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

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

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

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

php 匹配图片路径_php正则匹配图片路径原理与方法

下面我来给大家介绍在php正则匹配图片路径原理与实现方法&#xff0c;有需要了解的朋友可进入参考参考。提取src里面的图片地址还不足够&#xff0c;因为不能保证那个地址一定是绝对地址&#xff0c;完全的地址&#xff0c;如果那是相对的呢&#xff1f;如果地址诸如&#xff1…

数据科学 python_适用于数据科学的Python vs(和)R

数据科学 pythonChoosing the right programming language when taking on a new project is perhaps one of the most daunting decisions programmers often make.在进行新项目时选择正确的编程语言可能是程序员经常做出的最艰巨的决定之一。 Python and R are no doubt amon…

win10专业版激活(cmd方式)

转载于:https://www.cnblogs.com/bug-baba/p/11225322.html

命令行窗口常用的一些小技巧

一. 打开命令行窗口的方式 1. 按住【shift】键&#xff0c;在桌面右击&#xff0c;选择“在此处打开命令行窗口(W)”,如下图所示&#xff1a; 2. 按住【开始】 R快捷键&#xff0c;弹出运行窗口&#xff0c;输入cmd&#xff0c;回车&#xff08;确定&#xff09;即可。 二. 常用…

为什么即使在班级均衡的情况下,准确度仍然令人困扰

Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that many people are too comfo…

filebeat向kafka传输数据,无数据现象

通过netstat 能够看到filebeat确实是有向kafka传输数据&#xff0c; filebeat 日志显示 那就需要修改 /etc/hosts文件 将kafka主机的名字和ip写入filebeat主机的hosts文件中。 转载于:https://www.cnblogs.com/liuYGoo/p/11226272.html

感想篇:4)越来越精简的机械设计

本章目的&#xff1a;述说机械设计方向的发展。 kiss原则需要后期追加。 作者在写电机选用章节时想到了机构的问题&#xff0c;机械发展的前半生对机构来说无疑有会辉煌的成就&#xff0c;各种各样的机构能取得难以置信的成效&#xff0c;最终甚至可以说上升到了艺术的阶段。如…

浅谈传统企业网络运营那些事儿

网络的变革、更新推动的速度很快&#xff0c;小到出门购物全方位在原基础的微信/支付宝等第三方支付等&#xff0c;随着微信公众号/微信小程序等"轻"级传播推广渠道的发展&#xff0c;以及客观的传统企业在互联网的冲击下&#xff0c;同样的价格比服务&#xff1f;比…

vim 下web开发html css js插件

Vim下的Web开发之html,CSS,javascript插件HTML 下载HTML.zip 解压HTML.zip&#xff0c;然后将里面的所有文件copy到C:\Program Files\Vim\vimfiles目录下首先&#xff0c;你应该把“ filetype plugin on ”写入你的vimrc。重启vim。新建一个test.html文件。用gvim打开按 "…

Android_Event Bus 的基本用法

1 //事件总线分发2 public class MainActivity extends ActionBarActivity {3 Button button;4 TextView text;5 6 Override7 protected void onCreate(Bundle savedInstanceState) {8 super.onCreate(savedInstanceState);9 setContentView(R…

php企业黄页源码,PHPCMS 企业黄页模块 v9 GBK 正式版

PHPCMS V9采用OOP(面向对象)方式进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展&#xff0c;代码维护&#xff0c;优秀的二次开发能力&#xff0c;可满足所有网站的应用需求。PHPCMS V9企业黄页主要特色1、模型自定义&#xff0c;支持模型添加、修改…

fromEvent

fromEvent(selector,Event) 实际效果图 这个功能和cad 3dmax里面的鼠标定位功能一致吧&#xff0c;是不是有点小成就&#xff1f; 转载于:https://www.cnblogs.com/xiongwei2017/p/7074180.html

java虚拟机编译文件,理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么...

理解Java虚拟机(1)之一个.java文件编译成.class文件发生了什么最近在看《深入理解Java虚拟机》弄明白了很多java的底层知识&#xff0c;决定分几部分总结下&#xff0c;从.java文件编译&#xff0c;到类加载机制&#xff0c;内存分配垃圾回收机制&#xff0c;线程并发&#xff…

RabbitMQ学习系列(一): 介绍

1、介绍 RabbitMQ是一个由erlang开发的基于AMQP&#xff08;Advanced Message Queue &#xff09;协议的开源实现。用于在分布式系统中存储转发消息&#xff0c;在易用性、扩展性、高可用性等方面都非常的优秀。是当前最主流的消息中间件之一。 RabbitMQ的官网&#xff1a;http…

RabbitMQ学习系列(二): RabbitMQ安装与配置

1&#xff0e;安装 Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装RabbitMQ之前要先安装Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 注意&#xff1a; 1.现在先别装最新的 3…