91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java阻塞隊列的原理是什么

發布時間:2021-08-07 14:13:11 來源:億速云 閱讀:171 作者:Leah 欄目:編程語言

java阻塞隊列的原理是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

阻塞隊列與普通隊列的不同在于。當隊列是空的時候,從隊列中獲取元素的操作將會被阻塞,或者當隊列滿時,往隊列里面添加元素將會被阻塞。試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列,下圖展示了如何通過阻塞隊列來合作:

線程1往阻塞隊列中添加元素,而線程2從阻塞隊列中移除元素

從5.0開始,JDK在Java.util.concurrent包里提供了阻塞隊列的官方實現。盡管JDK中已經包含了阻塞隊列的官方實現。

阻塞隊列的實現

阻塞隊列的實現類似于帶上限的Semaphore的實現。

廢話不多說:

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方法內部,只有隊列的大小等于上限(limit)或者下限(0)時,才調用notifyAll方法。如果隊列的大小既不等于上限,也不等于下限,任何線程調用enqueue或者dequeue方法時,都不會阻塞,都能夠正常的往隊列中添加或者移除元素。

在Java中,對于Lock和Condition可以理解為對傳統的synchronized和wait/notify機制的替代。

wait/notify有個限制,調用wait/notify的線程必須持有對象的鎖。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武强县| 潜山县| 株洲县| 宜宾市| 阿拉善右旗| 渝北区| 海南省| 库尔勒市| 开封市| 峡江县| 宜宾市| 湖南省| 崇明县| 金湖县| 额敏县| 六枝特区| 长顺县| 昌平区| 香格里拉县| 柳州市| 晋城| 麻城市| 区。| 平湖市| 始兴县| 右玉县| 巴彦县| 寿宁县| 洪江市| 新兴县| 澄迈县| 天水市| 高邑县| 台南县| 太保市| 横山县| 贵德县| 博白县| 肇庆市| 南汇区| 班戈县|