久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java特性隊(duì)列和棧的堵塞原理解析

瀏覽:4日期:2022-08-22 14:22:47

做消息通信,消息會(huì)不斷從網(wǎng)絡(luò)流中取得,而后臺(tái)也有線程不斷消費(fèi)。本來(lái)我一直是使用一些線程安全標(biāo)識(shí)或方法來(lái)控制,后來(lái)在網(wǎng)上找到一些java新特性,里面包含了可以用到的堆棧使用,而且是堵塞的,這樣至少可以保證一些安全性。

對(duì)于堆:

BlockingQueue 不接受 null 元素。試圖 add、put 或 offer 一個(gè) null 元素時(shí),某些實(shí)現(xiàn)會(huì)拋出 NullPointerException。null 被用作指示 poll 操作失敗的警戒值。

BlockingQueue 可以是限定容量的。它在任意給定時(shí)間都可以有一個(gè) remainingCapacity,超出此容量,便無(wú)法無(wú)阻塞地 put 附加元素。沒(méi)有任何內(nèi)部容量約束的 BlockingQueue 總是報(bào)告 Integer.MAX_VALUE 的剩余容量。

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

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

看一段代碼:

package com.test; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; /** * @說(shuō)明 堵塞隊(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ì)列,如果沒(méi)有可用空間,將一直等待(如果有必要) bqueue.put(i); System.out.println('添加了元素:' + i); } System.out.println('----End----'); } }

運(yùn)行效果:

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

之后就會(huì)一直等待。

對(duì)于棧:

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

看一個(gè)例子:

package com.test; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; /** * @說(shuō)明 堵塞隊(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++) { // 將指定元素添加到此阻塞棧中,如果沒(méi)有可用空間,將一直等待(如果有必要)。 bDeque.putFirst(i); System.out.println('添加了元素:' + i); } System.out.println('----End----'); } }

運(yùn)行結(jié)果和堆一樣,也會(huì)產(chǎn)生等待。

對(duì)于兩者的解釋:

阻塞隊(duì)列的概念是,一個(gè)指定長(zhǎng)度的隊(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。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 丹棱县| 涞源县| 文水县| 潜山县| 莆田市| 麻江县| 富川| 拉萨市| 黑水县| 渭南市| 宝山区| 登封市| 清河县| 珠海市| 宜阳县| 榆中县| 诸暨市| 论坛| 根河市| 开阳县| 子洲县| 绥德县| 普兰店市| 江安县| 张家川| 平陆县| 资溪县| 永定县| 镇坪县| 玉溪市| 夹江县| 白玉县| 辉县市| 宣城市| 鄂州市| 昆山市| 繁峙县| 炉霍县| 澎湖县| 钟山县| 屏东市|