阻塞隊列實現

? 作者:小胡_不糊涂
🌱 作者主頁:小胡_不糊涂的個人主頁
📀 收錄專欄: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.pswp.cn/news/392388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392388.shtml
英文地址,請注明出處:http://en.pswp.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…