java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析
這篇文章主要介紹了java阻塞隊(duì)列實(shí)現(xiàn)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
阻塞隊(duì)列與普通隊(duì)列的不同在于。當(dāng)隊(duì)列是空的時(shí)候,從隊(duì)列中獲取元素的操作將會被阻塞,或者當(dāng)隊(duì)列滿時(shí),往隊(duì)列里面添加元素將會被阻塞。試圖從空的阻塞隊(duì)列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊(duì)列插入新的元素。同樣,試圖往已滿的阻塞隊(duì)列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊(duì)列重新變得空閑起來,如從隊(duì)列中移除一個(gè)或者多個(gè)元素,或者完全清空隊(duì)列,下圖展示了如何通過阻塞隊(duì)列來合作:
線程1往阻塞隊(duì)列中添加元素,而線程2從阻塞隊(duì)列中移除元素
從5.0開始,JDK在Java.util.concurrent包里提供了阻塞隊(duì)列的官方實(shí)現(xiàn)。盡管JDK中已經(jīng)包含了阻塞隊(duì)列的官方實(shí)現(xiàn)。
阻塞隊(duì)列的實(shí)現(xiàn)
阻塞隊(duì)列的實(shí)現(xiàn)類似于帶上限的Semaphore的實(shí)現(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)部,只有隊(duì)列的大小等于上限(limit)或者下限(0)時(shí),才調(diào)用notifyAll方法。如果隊(duì)列的大小既不等于上限,也不等于下限,任何線程調(diào)用enqueue或者dequeue方法時(shí),都不會阻塞,都能夠正常的往隊(duì)列中添加或者移除元素。
在Java中,對于Lock和Condition可以理解為對傳統(tǒng)的synchronized和wait/notify機(jī)制的替代。
wait/notify有個(gè)限制,調(diào)用wait/notify的線程必須持有對象的鎖。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis基于MapperScan注解的動態(tài)代理加載機(jī)制詳解
這篇文章主要介紹了Mybatis基于MapperScan注解的動態(tài)代理加載機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01spring @EventListener 事件與監(jiān)聽的示例詳解
本文介紹了自定義Spring事件和監(jiān)聽器的方法,包括如何發(fā)布事件、監(jiān)聽事件以及如何處理異步事件,通過示例代碼和日志,展示了事件的順序執(zhí)行和異步處理機(jī)制,感興趣的朋友一起看看吧2025-03-03SpringDataElasticsearch與SpEL表達(dá)式實(shí)現(xiàn)ES動態(tài)索引
這篇文章主要介紹了SpringDataElasticsearch與SpEL表達(dá)式實(shí)現(xiàn)ES動態(tài)索引,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Springcloud GateWay網(wǎng)關(guān)配置過程圖解
這篇文章主要介紹了Springcloud GateWay網(wǎng)關(guān)配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12maven+阿里云創(chuàng)建國內(nèi)鏡像的中央倉庫(親測可用)
本篇文章主要介紹了maven+阿里云創(chuàng)建國內(nèi)鏡像的中央倉庫(親測可用),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12