亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

帶你了解Java特性隊列和棧的堵塞原理

發布時間:2020-10-27 15:36:37 來源:億速云 閱讀:164 作者:Leah 欄目:開發技術

本篇文章為大家展示了帶你了解Java特性隊列和棧的堵塞原理,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

做消息通信,消息會不斷從網絡流中取得,而后臺也有線程不斷消費。本來我一直是使用一些線程安全標識或方法來控制,后來在網上找到一些java新特性,里面包含了可以用到的堆棧使用,而且是堵塞的,這樣至少可以保證一些安全性。

對于堆:

BlockingQueue 不接受 null 元素。試圖 add、put 或 offer 一個 null 元素時,某些實現會拋出 NullPointerException。null 被用作指示 poll 操作失敗的警戒值。

BlockingQueue 可以是限定容量的。它在任意給定時間都可以有一個 remainingCapacity,超出此容量,便無法無阻塞地 put 附加元素。沒有任何內部容量約束的 BlockingQueue 總是報告 Integer.MAX_VALUE 的剩余容量。

BlockingQueue 實現主要用于生產者-使用者隊列,但它另外還支持 Collection接口。因此,舉例來說,使用 remove(x) 從隊列中移除任意一個元素是有可能的。然而,這種操作通常不 會有效執行,只能有計劃地偶爾使用,比如在取消排隊信息時。

BlockingQueue 實現是線程安全的。所有排隊方法都可以使用內部鎖或其他形式的并發控制來自動達到它們的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)沒有 必要自動執行,除非在實現中特別說明。因此,舉例來說,在只添加了 c 中的一些元素后,addAll(c) 有可能失敗(拋出一個異常)。

看一段代碼:

package com.test; 
import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
/** 
 * @說明 堵塞隊列和棧的使用 
 */ 
public class Test { 
  @SuppressWarnings("unchecked") 
  public static void main(String[] args) throws InterruptedException { 
    BlockingQueue bqueue = new ArrayBlockingQueue(5); 
    for (int i = 0; i < 10; i++) { 
      // 添加元素到隊列,如果沒有可用空間,將一直等待(如果有必要) 
      bqueue.put(i); 
      System.out.println("添加了元素:" + i); 
    } 
    System.out.println("----End----"); 
  } 
}

運行效果:

添加了元素:0
添加了元素:1
添加了元素:2
添加了元素:3
添加了元素:4

之后就會一直等待。

對于棧:

BlockingDeque 方法有四種形式,使用不同的方式處理無法立即滿足但在將來某一時刻可能滿足的操作:第一種方式拋出異常;第二種返回一個特殊值(null 或 false,具體取決于操作);第三種無限期阻塞當前線程,直至操作成功;第四種只阻塞給定的最大時間,然后放棄。

看一個例子:

package com.test; 
import java.util.concurrent.BlockingDeque; 
import java.util.concurrent.LinkedBlockingDeque; 
/** 
 * @說明 堵塞隊列和棧的使用 
 */ 
public class Test { 
  @SuppressWarnings("unchecked") 
  public static void main(String[] args) throws InterruptedException { 
    BlockingDeque bDeque = new LinkedBlockingDeque(5); 
    for (int i = 0; i < 10; i++) { 
      // 將指定元素添加到此阻塞棧中,如果沒有可用空間,將一直等待(如果有必要)。 
      bDeque.putFirst(i); 
      System.out.println("添加了元素:" + i); 
    } 
    System.out.println("----End----"); 
  } 
} 

運行結果和堆一樣,也會產生等待。

對于兩者的解釋:

阻塞隊列的概念是,一個指定長度的隊列,如果隊列滿了,添加新元素的操作會被阻塞等待,直到有空位為止。同樣,當隊列為空時候,請求隊列元素的操作同樣會阻塞等待,直到有可用元素為止。

對于阻塞棧,與阻塞隊列相似。不同點在于棧是“后入先出”的結構,每次操作的是棧頂,而隊列是“先進先出”的結構,每次操作的是隊列頭。

注意的是,BlockingQueue是5中的特性,jdk6以后才增加了BlockingDeque。

上述內容就是帶你了解Java特性隊列和棧的堵塞原理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

贵德县| 隆林| 白城市| 出国| 孝义市| 修武县| 喀什市| 大港区| 瑞安市| 达尔| 吴堡县| 洱源县| 陆川县| 凤山县| 福泉市| 平度市| 乌拉特后旗| 龙游县| 崇礼县| 四会市| 太仓市| 新化县| 闵行区| 景洪市| 嘉善县| 海伦市| 津市市| 岐山县| 温州市| 黄石市| 中江县| 独山县| 惠来县| 荆州市| 奉贤区| 辽宁省| 西盟| 丹凤县| 毕节市| 全州县| 乌兰浩特市|