java阻塞隊列實現(xiàn)原理及實例解析
這篇文章主要介紹了java阻塞隊列實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
阻塞隊列與普通隊列的不同在于。當(dāng)隊列是空的時候,從隊列中獲取元素的操作將會被阻塞,或者當(dāng)隊列滿時,往隊列里面添加元素將會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列,下圖展示了如何通過阻塞隊列來合作:
線程1往阻塞隊列中添加元素,而線程2從阻塞隊列中移除元素
從5.0開始,JDK在Java.util.concurrent包里提供了阻塞隊列的官方實現(xiàn)。盡管JDK中已經(jīng)包含了阻塞隊列的官方實現(xiàn)。
阻塞隊列的實現(xiàn)
阻塞隊列的實現(xiàn)類似于帶上限的Semaphore的實現(xiàn)。
廢話不多說:
package com.huojg.test; import java.util.LinkedList; import java.util.List; public class BlockingQueue { private List queue = new LinkedList(); private int limit = 10; public BlockingQueue(int limit){ this.limit = limit; } public synchronized void enqueue(Object item) throws InterruptedException { while(this.queue.size() == this.limit) { wait(); } if(this.queue.size() == 0) { notifyAll(); } this.queue.add(item); } public synchronized Object dequeue() throws InterruptedException{ while(this.queue.size() == 0){ wait(); } if(this.queue.size() == this.limit){ notifyAll(); } return this.queue.remove(0); } }
必須注意到,在enqueue和dequeue方法內(nèi)部,只有隊列的大小等于上限(limit)或者下限(0)時,才調(diào)用notifyAll方法。如果隊列的大小既不等于上限,也不等于下限,任何線程調(diào)用enqueue或者dequeue方法時,都不會阻塞,都能夠正常的往隊列中添加或者移除元素。
在Java中,對于Lock和Condition可以理解為對傳統(tǒng)的synchronized和wait/notify機(jī)制的替代。
wait/notify有個限制,調(diào)用wait/notify的線程必須持有對象的鎖。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
idea每次新打開的項目窗口maven都要重新設(shè)置問題
這篇文章主要介紹了idea每次新打開的項目窗口maven都要重新設(shè)置問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11spring-Kafka中的@KafkaListener深入源碼解讀
本文主要通過深入了解源碼,梳理從spring啟動到真正監(jiān)聽kafka消息的這套流程,從spring啟動開始處理@KafkaListener,本文結(jié)合實例流程圖給大家講解的非常詳細(xì),需要的朋友參考下2023-02-02計算Java數(shù)組長度函數(shù)的方法以及代碼分析
在本篇內(nèi)容里,小編給大家整理了關(guān)于計算Java數(shù)組長度函數(shù)的方法以及代碼分析內(nèi)容,有興趣的朋友么可以學(xué)習(xí)參考下。2022-11-11java面試JDK8?new?ReentrantLock()加鎖流程解析
這篇文章主要為大家介紹了java面試JDK8?new?ReentrantLock()加鎖流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07