[toc]
有界隊列
- SynchronousQueue:
“是這樣 一種阻塞隊列,其中每個 put 必須等待一個 take,反之亦然。同步隊列沒有任何內(nèi)部容量。翻譯一下:這是一個內(nèi)部沒有任何容量的阻塞隊列,任何一次插入操作的元素都要等待相對的刪除/讀取操作,否則進(jìn)行插入操作的線程就要一直等待,反之亦然。
- ArrayBlockingQueue:
一個由數(shù)組支持的有界阻塞隊列。此隊列按 FIFO(先進(jìn)先出)原則對元素進(jìn)行排序。新元素插入到隊列的尾部,隊列獲取操作則是從隊列頭部開始獲得元素。這是一個典型的“有界緩存區(qū)”,固定大小的數(shù)組在其中保持生產(chǎn)者插入的元素和使用者提取的元素。一旦創(chuàng)建了這樣的緩存區(qū),就不能再增加其容量。試圖向已滿隊列中放入元素會導(dǎo)致操作受阻塞;試圖從空隊列中提取元素將導(dǎo)致類似阻塞。
無界隊列
- LinkedBlockingQueue:
LinkedBlockingQueue是我們在ThreadPoolExecutor線程池中常用的等待隊列。它可以指定容量也可以不指定容量。由于它具有“無限容量”的特性,所以我還是將它歸入了無限隊列的范疇(實際上任何無限容量的隊列/棧都是有容量的,這個容量就是Integer.MAX_VALUE)。
LinkedBlockingQueue的實現(xiàn)是基于鏈表結(jié)構(gòu),而不是類似ArrayBlockingQueue那樣的數(shù)組。但實際使用過程中,不需要關(guān)心它的內(nèi)部實現(xiàn),如果指定了LinkedBlockingQueue的容量大小,那么它反映出來的使用特性就和ArrayBlockingQueue類似了。
- LinkedBlockingDeque
LinkedBlockingDeque是一個基于鏈表的雙端隊列。LinkedBlockingQueue的內(nèi)部結(jié)構(gòu)決定了它只能從隊列尾部插入,從隊列頭部取出元素;但是LinkedBlockingDeque既可以從尾部插入/取出元素,還可以從頭部插入元素/取出元素。
- PriorityBlockingQueue
PriorityBlockingQueue是一個按照優(yōu)先級進(jìn)行內(nèi)部元素排序的無限隊列。存放在PriorityBlockingQueue中的元素必須實現(xiàn)Comparable接口,這樣才能通過實現(xiàn)compareTo()方法進(jìn)行排序。優(yōu)先級最高的元素將始終排在隊列的頭部;PriorityBlockingQueue不會保證優(yōu)先級一樣的元素的排序,也不保證當(dāng)前隊列中除了優(yōu)先級最高的元素以外的元素,隨時處于正確排序的位置。
這是什么意思呢?PriorityBlockingQueue并不保證除了隊列頭部以外的元素排序一定是正確的。請看下面的示例代碼:
- LinkedTransferQueue
LinkedTransferQueue也是一個無限隊列,它除了具有一般隊列的操作特性外(先進(jìn)先出),還具有一個阻塞特性:LinkedTransferQueue可以由一對生產(chǎn)者/消費者線程進(jìn)行操作,當(dāng)消費者將一個新的元素插入隊列后,消費者線程將會一直等待,直到某一個消費者線程將這個元素取走,反之亦然。
LinkedTransferQueue的操作特性可以由下面這段代碼提現(xiàn)。在下面的代碼片段中,有兩中類型的線程:生產(chǎn)者和消費者,這兩類線程互相等待對方的操作: