日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的队列

發(fā)布時間:2023/12/14 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的队列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

阻塞隊列與普通隊列的區(qū)別在于,當隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當隊列是滿時,往隊列里添加元素的操作會被阻塞。

?

試圖從空的阻塞隊列中獲取元素的線程將會被阻塞,直到其他的線程往空的隊列插入新的元素。

?

同樣,試圖往已滿的阻塞隊列中添加新元素的線程同樣也會被阻塞,直到其他的線程使隊列重新變得空閑起來,如從隊列中移除一個或者多個元素,或者完全清空隊列。

?

?Java中的隊列都有哪些,有什么區(qū)別?

1)ArrayDeque, (數(shù)組雙端隊列)?

2)PriorityQueue, (優(yōu)先級隊列)?

3)ConcurrentLinkedQueue, (基于鏈表的并發(fā)隊列)?

4)DelayQueue, (延期阻塞隊列)(阻塞隊列實現(xiàn)了BlockingQueue接口)?

5)ArrayBlockingQueue, (基于數(shù)組的并發(fā)阻塞隊列)?

6)LinkedBlockingQueue, (基于鏈表的FIFO阻塞隊列)?

7)LinkedBlockingDeque, (基于鏈表的FIFO雙端阻塞隊列)?

8)PriorityBlockingQueue, (帶優(yōu)先級的無界阻塞隊列)?

9)SynchronousQueue,?(并發(fā)同步阻塞隊列)

?

阻塞隊列和生產(chǎn)者-消費者模式

阻塞隊列(Blocking queue)提供了可阻塞的put和take方法,它們與可定時的offer和poll是等價的。如果Queue已經(jīng)滿了,put方法會被阻塞直到有空間可用;如果Queue是空的,那么take方法會被阻塞,直到有元素可用。Queue的長度可以有限,也可以無限;無限的Queue永遠不會充滿,所以它的put方法永遠不會阻塞。

?

阻塞隊列支持生產(chǎn)者-消費者設計模式。一個生產(chǎn)者-消費者設計分離了“生產(chǎn)產(chǎn)品”和“消費產(chǎn)品”。該模式不會發(fā)現(xiàn)一個工作便立即處理,而是把工作置于一個任務(“to do”)清單中,以備后期處理。

?

生產(chǎn)者-消費者模式簡化了開發(fā),因為它解除了生產(chǎn)者和消費者之間相互依賴的代碼。生產(chǎn)者和消費者以不同的或者變化的速度生產(chǎn)和消費數(shù)據(jù),生產(chǎn)者-消費者模式將這些活動解耦,因而簡化了工作負荷的管理。

?

生產(chǎn)者-消費者設計是圍繞阻塞隊列展開的,生產(chǎn)者把數(shù)據(jù)放入隊列,并使數(shù)據(jù)可用,當消費者為適當?shù)男袨樽鰷蕚鋾r會從隊列中獲取數(shù)據(jù)。

?

生產(chǎn)者不需要知道消費者的省份或者數(shù)量,甚至根本沒有消費者—它們只負責把數(shù)據(jù)放入隊列。類似地,消費者也不需要知道生產(chǎn)者是誰,以及是誰給它們安排的工作。

?

BlockingQueue可以使用任意數(shù)量的生產(chǎn)者和消費者,從而簡化了生產(chǎn)者-消費者設計的實現(xiàn)。最常見的生產(chǎn)者-消費者設計是將線程池與工作隊列相結(jié)合。

?

阻塞隊列簡化了消費者的編碼,因為take會保持阻塞直到可用數(shù)據(jù)出現(xiàn)。如果生產(chǎn)者不能足夠快地產(chǎn)生工作,讓消費者忙碌起來,那么消費者只能一直等待,直到有工作可做。

?

同時,put方法的阻塞特性也大大地簡化了生產(chǎn)者的編碼;如果使用一個有界隊列,那么當隊列充滿的時候,生產(chǎn)者就會阻塞,暫不能生成更多的工作,從而給消費者時間來趕進進度。

?

有界隊列是強大的資源管理工具,用來建立可靠的應用程序:它們遏制那些可以產(chǎn)生過多工作量、具有威脅的活動,從而讓你的程序在面對超負荷工作時更加健壯。

?

雖然生產(chǎn)者-消費者模式可以把生產(chǎn)者和消費者的代碼相互解耦合,但是它們的行為還是間接地通過共享隊列耦合在一起了。

?

類庫中包含一些BlockingQueue的實現(xiàn),其中LinkedBlockingQueueArrayBlockingQueue是FIFO隊列,與 LinkedList和ArrayList相似,但是卻擁有比同步List更好的并發(fā)性能。

?

PriorityBlockingQueue是一個按優(yōu)先級順序排序的隊列,當你不希望按照FIFO的屬性處理元素時,這個PriorityBolckingQueue是非常有用的。

?

正如其他排序的容器一樣,PriorityBlockingQueue可以比較元素本身的自然順序(如果它們實現(xiàn)了Comparable),也可以使用一個?Comparator進行排序。

?

最后一個BlockingQueue的實現(xiàn)是SynchronousQueue,它根本上不是一個真正的隊列,因為它不會為隊列元素維護任何存儲空間。不過,它維護一個排隊的線程清單,這些線程等待把元素加入(enqueue)隊列或者移出(dequeue)隊列。

?

因為SynchronousQueue沒有存儲能力,所以除非另一個線程已經(jīng)準備好參與移交工作,否則put和take會一直阻止。SynchronousQueue這類隊列只有在消費者充足的時候比較合適,它們總能為下一個任務作好準備。

?

非阻塞算法

基于鎖的算法會帶來一些活躍度失敗的風險。如果線程在持有鎖的時候因為阻塞I/O,頁面錯誤,或其他原因發(fā)生延遲,很可能所有的線程都不能前進了。?

?

一個線程的失敗或掛起不應該影響其他線程的失敗或掛起,這樣的算法成為非阻塞(nonblocking)算法;如果算法的每一個步驟中都有一些線程能夠繼續(xù)執(zhí)行,那么這樣的算法稱為鎖自由(lock-free)算法。在線程間使用CAS進行協(xié)調(diào),這樣的算法如果能構(gòu)建正確的話,它既是非阻塞的,又是鎖自由的。

?

非競爭的CAS總是能夠成功,如果多個線程以一個CAS競爭,總會有一個勝出并前進。非阻塞算法堆死鎖和優(yōu)先級倒置有“免疫性”(但它們可能會出現(xiàn)饑餓和活鎖,因為它們允許重進入)。

?

非阻塞算法通過使用低層次的并發(fā)原語,比如比較交換,取代了鎖。原子變量類向用戶提供了這些底層級原語,也能夠當做“更佳的volatile變量”使用,同時提供了整數(shù)類和對象引用的原子化更新操作。

總結(jié)

以上是生活随笔為你收集整理的Java中的队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。