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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

学习Java: Queue

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

15 08, 2007

學(xué)習(xí)Java: Queue

Java — 作者 zybing @ 15:17 Java提供了Quere,相當(dāng)好用,在1.5版本中又有增強(qiáng)。

Queue: 基本上,一個隊(duì)列就是一個先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)

offer,add區(qū)別:
一些隊(duì)列有大小限制,因此如果想在一個滿的隊(duì)列中加入一個新項(xiàng),多出的項(xiàng)就會被拒絕。
這時新的 offer 方法就可以起作用了。它不是對調(diào)用 add() 方法拋出一個 unchecked 異常,而只是得到由 offer() 返回的 false。

poll,remove區(qū)別:
remove() 和 poll() 方法都是從隊(duì)列中刪除第一個元素(head)。remove() 的行為與 Collection 接口的版本相似,
但是新的 poll() 方法在用空集合調(diào)用時不是拋出異常,只是返回 null。因此新的方法更適合容易出現(xiàn)異常條件的情況。

peek,element區(qū)別:
element() 和 peek() 用于在隊(duì)列的頭部查詢元素。與 remove() 方法類似,在隊(duì)列為空時, element() 拋出一個異常,而 peek() 返回 null。

-----------------------------------------------------------------------------------------
Tiger中有2組Queue的實(shí)現(xiàn):實(shí)現(xiàn)了新的BlockingQueue接口的
和沒有實(shí)現(xiàn)的

-------------------------------------------------------------
沒有實(shí)現(xiàn)的阻塞接口的:LinkedList: 實(shí)現(xiàn)了java.util.Queue接口
java.util.AbstractQueue
內(nèi)置的不阻塞隊(duì)列: PriorityQueue 和 ConcurrentLinkedQueue

PriorityQueue 和 ConcurrentLinkedQueue 類在 Collection Framework 中加入兩個具體集合實(shí)現(xiàn)。

PriorityQueue 類實(shí)質(zhì)上維護(hù)了一個有序列表。加入到 Queue 中的元素根據(jù)它們的天然排序(通過其 java.util.Comparable 實(shí)現(xiàn))或者根據(jù)傳遞給構(gòu)造函數(shù)的 java.util.Comparator 實(shí)現(xiàn)來定位。

ConcurrentLinkedQueue 是基于鏈接節(jié)點(diǎn)的、線程安全的隊(duì)列。并發(fā)訪問不需要同步。因?yàn)樗陉?duì)列的尾部添加元素并從頭部刪除它們,所以只要不需要知道隊(duì)列的大小,ConcurrentLinkedQueue 對公共集合的共享訪問就可以工作得很好。收集關(guān)于隊(duì)列大小的信息會很慢,需要遍歷隊(duì)列。

------------------------------------------------------------------
實(shí)現(xiàn)阻塞接口的:

新的 java.util.concurrent 包在 Collection Framework 中可用的具體集合類中加入了 BlockingQueue 接口和五個阻塞隊(duì)列類。

它實(shí)質(zhì)上就是一種帶有一點(diǎn)扭曲的 FIFO 數(shù)據(jù)結(jié)構(gòu)。不是立即從隊(duì)列中添加或者刪除元素,線程執(zhí)行操作阻塞,直到有空間或者元素可用。

五個隊(duì)列所提供的各有不同:

* ArrayBlockingQueue :一個由數(shù)組支持的有界隊(duì)列。
* LinkedBlockingQueue :一個由鏈接節(jié)點(diǎn)支持的可選有界隊(duì)列。
* PriorityBlockingQueue :一個由優(yōu)先級堆支持的無界優(yōu)先級隊(duì)列。
* DelayQueue :一個由優(yōu)先級堆支持的、基于時間的調(diào)度隊(duì)列。
* SynchronousQueue :一個利用 BlockingQueue 接口的簡單聚集(rendezvous)機(jī)制。


前兩個類 ArrayBlockingQueueLinkedBlockingQueue 幾乎相同,只是在后備存儲器方面有所不同, LinkedBlockingQueue 并不總是有容量界限。無大小界限的 LinkedBlockingQueue 類在添加元素時永遠(yuǎn)不會有阻塞隊(duì)列的等待(至少在其中有Integer.MAX_VALUE 元素之前不會)。

PriorityBlockingQueue 是具有無界限容量的隊(duì)列,它利用所包含元素的 Comparable 排序順序來以邏輯順序維護(hù)元素??梢詫⑺醋?TreeSet 的可能替代物。不過對 PriorityBlockingQueue 有一個技巧。從 iterator() 返回的 Iterator 實(shí)例不需要以優(yōu)先級順序返回元素。如果必須以優(yōu)先級順序遍歷所有元素,那么讓它們都通過 toArray() 方法并自己對它們排序,像 Arrays.sort(pq.toArray())。

新的 DelayQueue 實(shí)現(xiàn)可能是其中最有意思(也是最復(fù)雜)的一個。加入到隊(duì)列中的元素必須實(shí)現(xiàn)新的 Delayed 接口(只有一個方法 —— long getDelay(java.util.concurrent.TimeUnit unit) )。因?yàn)殛?duì)列的大小沒有界限,使得添加可以立即返回,但是在延遲時間過去之前不能從隊(duì)列中取出元素。如果多個元素完成了延遲,那么最早失效/失效時間最長的元素將第一個取出。實(shí)際上沒有聽上去這樣復(fù)雜。

SynchronousQueue 類是最簡單的。它沒有內(nèi)部容量。它就像線程之間的手遞手機(jī)制。在隊(duì)列中加入一個元素的生產(chǎn)者會等待另一個線程的消費(fèi)者。當(dāng)這個消費(fèi)者出現(xiàn)時,這個元素就直接在消費(fèi)者和生產(chǎn)者之間傳遞,永遠(yuǎn)不會加入到阻塞隊(duì)列中。

----------------------------------------------
實(shí)驗(yàn)結(jié)果:

文檔說BlockingQueue的隊(duì)列: 不是立即從隊(duì)列中添加或者刪除元素,線程執(zhí)行操作阻塞,直到有空間或者元素可用。

實(shí)驗(yàn)了一下,使用put、take是這樣子的,線程在等待
而使用offer是立刻返回false的


總結(jié)

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

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