Java特性隊(duì)列和棧的堵塞原理解析
做消息通信,消息會(huì)不斷從網(wǎng)絡(luò)流中取得,而后臺(tái)也有線程不斷消費(fèi)。本來我一直是使用一些線程安全標(biāo)識(shí)或方法來控制,后來在網(wǎng)上找到一些java新特性,里面包含了可以用到的堆棧使用,而且是堵塞的,這樣至少可以保證一些安全性。
對(duì)于堆:
BlockingQueue 不接受 null 元素。試圖 add、put 或 offer 一個(gè) null 元素時(shí),某些實(shí)現(xiàn)會(huì)拋出 NullPointerException。null 被用作指示 poll 操作失敗的警戒值。
BlockingQueue 可以是限定容量的。它在任意給定時(shí)間都可以有一個(gè) remainingCapacity,超出此容量,便無法無阻塞地 put 附加元素。沒有任何內(nèi)部容量約束的 BlockingQueue 總是報(bào)告 Integer.MAX_VALUE 的剩余容量。
BlockingQueue 實(shí)現(xiàn)主要用于生產(chǎn)者-使用者隊(duì)列,但它另外還支持 Collection接口。因此,舉例來說,使用 remove(x) 從隊(duì)列中移除任意一個(gè)元素是有可能的。然而,這種操作通常不 會(huì)有效執(zhí)行,只能有計(jì)劃地偶爾使用,比如在取消排隊(duì)信息時(shí)。
BlockingQueue 實(shí)現(xiàn)是線程安全的。所有排隊(duì)方法都可以使用內(nèi)部鎖或其他形式的并發(fā)控制來自動(dòng)達(dá)到它們的目的。然而,大量的 Collection 操作(addAll、containsAll、retainAll 和 removeAll)沒有 必要自動(dòng)執(zhí)行,除非在實(shí)現(xiàn)中特別說明。因此,舉例來說,在只添加了 c 中的一些元素后,addAll(c) 有可能失?。⊕伋鲆粋€(gè)異常)。
看一段代碼:
package com.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* @說明 堵塞隊(duì)列和棧的使用
*/
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++) {
// 添加元素到隊(duì)列,如果沒有可用空間,將一直等待(如果有必要)
bqueue.put(i);
System.out.println("添加了元素:" + i);
}
System.out.println("----End----");
}
}
運(yùn)行效果:
添加了元素:0
添加了元素:1
添加了元素:2
添加了元素:3
添加了元素:4
之后就會(huì)一直等待。
對(duì)于棧:
BlockingDeque 方法有四種形式,使用不同的方式處理無法立即滿足但在將來某一時(shí)刻可能滿足的操作:第一種方式拋出異常;第二種返回一個(gè)特殊值(null 或 false,具體取決于操作);第三種無限期阻塞當(dāng)前線程,直至操作成功;第四種只阻塞給定的最大時(shí)間,然后放棄。
看一個(gè)例子:
package com.test;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
* @說明 堵塞隊(duì)列和棧的使用
*/
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----");
}
}
運(yùn)行結(jié)果和堆一樣,也會(huì)產(chǎn)生等待。
對(duì)于兩者的解釋:
阻塞隊(duì)列的概念是,一個(gè)指定長度的隊(duì)列,如果隊(duì)列滿了,添加新元素的操作會(huì)被阻塞等待,直到有空位為止。同樣,當(dāng)隊(duì)列為空時(shí)候,請(qǐng)求隊(duì)列元素的操作同樣會(huì)阻塞等待,直到有可用元素為止。
對(duì)于阻塞棧,與阻塞隊(duì)列相似。不同點(diǎn)在于棧是“后入先出”的結(jié)構(gòu),每次操作的是棧頂,而隊(duì)列是“先進(jìn)先出”的結(jié)構(gòu),每次操作的是隊(duì)列頭。
注意的是,BlockingQueue是5中的特性,jdk6以后才增加了BlockingDeque。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
- Java數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列實(shí)例詳解
- Java數(shù)據(jù)結(jié)構(gòu)專題解析之棧和隊(duì)列的實(shí)現(xiàn)
- Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之棧和隊(duì)列
- 如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java
- Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊(duì)列、樹的實(shí)現(xiàn)方法示例
- Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享
- Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解
相關(guān)文章
Netty分布式ByteBuf使用subPage級(jí)別內(nèi)存分配剖析
這篇文章主要為大家介紹了Netty分布式ByteBuf使用subPage級(jí)別內(nèi)存分配剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
java多線程實(shí)現(xiàn)服務(wù)器端與多客戶端之間的通信
本篇文章主要介紹了java多線程實(shí)現(xiàn)服務(wù)器端與多客戶端之間的通信,介紹了多線程來實(shí)現(xiàn)服務(wù)器與多線程之間的通信的基本步驟,有需要的小伙伴可以參考下。2016-10-10
Java之Spring簡單的讀取和存儲(chǔ)對(duì)象
這篇文章主要介紹了Spring的讀取和存儲(chǔ)對(duì)象,獲取 bean 對(duì)象也叫做對(duì)象裝配,是把對(duì)象取出來放到某個(gè)類中,有時(shí)候也叫對(duì)象注?,想進(jìn)一步了解的同學(xué)可以參考本文2023-04-04
Java學(xué)習(xí)之反射機(jī)制及應(yīng)用場(chǎng)景介紹
本篇文章主要介紹了Java反射機(jī)制及應(yīng)用場(chǎng)景,反射機(jī)制是很多Java框架的基石。非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-11-11
Java實(shí)現(xiàn)的對(duì)稱加密算法3DES定義與用法示例
這篇文章主要介紹了Java實(shí)現(xiàn)的對(duì)稱加密算法3DES定義與用法,結(jié)合實(shí)例形式簡單分析了Java 3DES加密算法的相關(guān)定義與使用技巧,需要的朋友可以參考下2018-04-04
Java中基于maven實(shí)現(xiàn)zxing二維碼功能
這篇文章主要介紹了Java中基于maven實(shí)現(xiàn)zxing二維碼功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
SpringBoot實(shí)現(xiàn)發(fā)送電子郵件
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)發(fā)送電子郵件,電子郵件是—種用電子手段提供信息交換的通信方式,是互聯(lián)網(wǎng)應(yīng)用最廣的服務(wù)。通過網(wǎng)絡(luò)的電子郵件系統(tǒng),用戶可以非??焖俚姆绞?,與世界上任何一個(gè)角落的網(wǎng)絡(luò)用戶聯(lián)系,下面就來看看SpringBoot如何實(shí)現(xiàn)發(fā)送電子郵件吧2022-01-01

