四種隊列解析總結

隊列是一種特殊的線性表。

只允許在表的前端進行刪除操作,在表的後端進行插入操作。

1.普通隊列

舉例:

import java.util.LinkedList;
import java.util.Queue;

    public class Main {
        public static void main(String[] args) {
            //add()和remove()方法在失敗的時候會拋出異常(不推薦)
            Queue<String> queue = new LinkedList<String>();
            //添加元素
            queue.offer("a");
            queue.offer("b");
            queue.offer("c");
            queue.offer("d");
            queue.offer("e");
            for(String q : queue){
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("poll="+queue.poll()); //返回第一個元素,並在隊列中刪除
            for(String q : queue){
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("element="+queue.element()); //返回第一個元素 
            for(String q : queue){
                System.out.println(q);
            }
            System.out.println("===");
            System.out.println("peek="+queue.peek()); //返回第一個元素 
            for(String q : queue){
                System.out.println(q);
            }
        }
    }

Java 實例 - 隊列(Queue)用法

2.阻塞隊列(應用於多線程場景):

阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作支持阻塞的插入和移除方法

1)支持阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。

2)支持阻塞的移除方法:意思是在隊列爲空時,獲取元素的線程會等待隊列變爲非空

JDK 7 提供了7個阻塞隊列,如下

1、ArrayBlockingQueue 數組結構組成的有界阻塞隊列。

此隊列按照先進先出(FIFO)的原則對元素進行排序,但是默認情況下不保證線程公平的訪問隊列,即如果隊列滿了,那麼被阻塞在外面的線程對隊列訪問的順序是不能保證線程公平(即先阻塞,先插入)的。

2、LinkedBlockingQueue一個由鏈表結構組成的有界阻塞隊列

此隊列按照先出先進的原則對元素進行排序

3、PriorityBlockingQueue 支持優先級的無界阻塞隊列

4、DelayQueue 支持延時獲取元素的無界阻塞隊列,即可以指定多久才能從隊列中獲取當前元素

5、SynchronousQueue不存儲元素的阻塞隊列,每一個put必須等待一個take操作,否則不能繼續添加元素。並且他支持公平訪問隊列。

6、LinkedTransferQueue由鏈表結構組成的無界阻塞TransferQueue隊列。相對於其他阻塞隊列,多了tryTransfer和transfer方法

transfer方法

如果當前有消費者正在等待接收元素(take或者待時間限制的poll方法),transfer可以把生產者傳入的元素立刻傳給消費者。如果沒有消費者等待接收元素,則將元素放在隊列的tail節點,並等到該元素被消費者消費了才返回。

tryTransfer方法

用來試探生產者傳入的元素能否直接傳給消費者。,如果沒有消費者在等待,則返回false。和上述方法的區別是該方法無論消費者是否接收,方法立即返回。而transfer方法是必須等到消費者消費了才返回。

7、LinkedBlockingDeque鏈表結構的雙向阻塞隊列,優勢在於多線程入隊時,減少一半的競爭。

3.併發隊列

併發,在操作系統中,是指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。

在併發隊列上JDK提供了兩套實現,

一個是以ConcurrentLinkedQueue爲代表的高性能隊列非阻塞,

一個是以BlockingQueue接口爲代表的阻塞隊列,無論哪種都繼承自Queue。

先進先出(FIFO):先插入的隊列的元素也最先出隊列,類似於排隊的功能。從某種程度上來說這種隊列也體現了一種公平性。

後進先出(LIFO):後插入隊列的元素最先出隊列,這種隊列優先處理最近發生的事件。

4.雙端隊列

雙端隊列deque ,一種具有隊列和棧的性質的數據結構。雙端隊列中的元素可以從兩端彈出,相比list增加[]運算符重載。

雙端隊列允許在隊列兩端進行插入/刪除操作。

Deque是一個雙端隊列接口,繼承自Queue接口。
具體內容來自以下鏈接,本文僅是作爲初學者的簡單總結和記錄

經典算法19-雙端隊列

什麼是阻塞隊列? 如何使用阻塞隊列來實現生產者-消費者模型?

java阻塞隊列

阻塞隊列/隊列阻塞機制(原理)和解決方式

併發編程之併發隊列

Java雙端隊列Deque使用詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章