1. 程式人生 > >Java中常用七個阻塞佇列的總結

Java中常用七個阻塞佇列的總結

Java佇列總結

通過前面文章的學習,我們對Java中常用佇列做了介紹。本文,咱們來對佇列做個總結吧。

首先,我們介紹了現實生活中的實際場景(排隊買票等),來告訴我們為什麼需要使用佇列。

佇列是一種先進先出(FIFO)的抽象資料結構,在Java中,佇列使用了兩種資料型別來實現的,分別是:陣列和連結串列這兩種資料結構。

本文主要內容:回顧Java中常用的七個阻塞佇列進行總結及阻塞佇列中四組AP並進行總結。

本文來源:本文是由凱哥Java(kaigejava)原創釋出。

接著,我們介紹了佇列的分類,可以分為兩類,即阻塞佇列和非阻塞佇列。

常用的三個非阻塞佇列:LinkedList、PriorityQueue和ConcurrentLinkedQueue.

(PS:凱哥沒有做介紹,在以後的文章中,凱哥將對ConcurrentLinkedQueue進行介紹)

然後我們介紹Java中常用的七個阻塞佇列。他們之間類圖關係:

 

我們可以看到,佇列是Collection的子類。也即和arrayList類似的。

接著我們就對七個阻塞佇列做了詳細的介紹。

阻塞佇列的七個子類

ArrayBlockingQueue(下文簡稱:ABQueue)、LinkedBlockingQueue(下文簡稱:LBQueue)、PriorityBlockingQueue(下文簡稱:PBQueue)、DelayQueue(下文簡稱:DQueue)、SynchronouseQueue(下文簡稱:SyncQueue)、LinkedTrnsferQueue(下文簡稱:LTQueue)、LinkedBlockingDeque(下文簡稱:LBDeque)這個七個。

 

來分別說說每個佇列的特點:

ABQueue:

底層使用的是陣列結構。因為陣列需要初始化大小,所以其構造器需要輸入佇列的大小。

是有界的阻塞安全佇列(思考:為什麼說是有界的?是怎麼保證執行緒安全的?),預設是不保證執行緒的公平性(思考:為什麼預設不能保證執行緒公平?如何保證執行緒安全?),不允許向佇列中插入null元素。

LBQueue:

“有界”的阻塞安全佇列,其底層使用的是連結串列的資料結構。所謂的“有界”是因為,預設佇列的大小是Integer.MAX_VALUE。這個數值等於21億+。因為這個資料太大了,也可以理解為無界的。不建議使用預設值,最好在初始化的時候,指定佇列的大小。

PBQueue:

是一個支援優先順序的無界佇列。支援優先順序是因為使用了comparator這個介面。預設採用字典升序排序策略的。如果不想使用預設的,在初始化的時候,還可以自定義比較器的。

以上三個佇列相關更詳細的介紹,歡迎回看《Java中常用的七個阻塞佇列介紹第一篇》。在這篇文章中,凱哥對這三個佇列做了詳細的介紹以及程式碼演示。

DQueue:

是一個支援優先順序的無界阻塞佇列。支援優先順序是應該底層使用的是PriorityQueue佇列來實現的。而PriorityQueue佇列在新增元素的時候使用了siftUpComparable方法。這個對了的一個特點:支援延時獲取。所以,這個佇列可以運用在快取系統的設計中。當從佇列中獲取到資料,說明延時時間到了。

關於DQueue更多詳細的介紹,歡迎回看:《Java中常用的七個阻塞佇列第二篇DelayQueue原始碼介紹》。在這篇文章中,凱哥做了詳細的介紹,同時使用程式碼模擬了快取資料到期操作。

SyncQueue:

是一個無儲存空間的阻塞同步佇列。不儲存元素的原因是因為,一個put操作必須等待一個take操作與之對應才可以。否則就不能繼續新增元素了。預設使用非公平的。在效能上SyncQueue佇列的吞吐量比LBqueu和ABQueue的效能高。

LTQueue:是由連結串列組成的無界佇列。比其他佇列多了兩個方法:tryTransfer、transfer

LBDeque:連結串列組成的雙端佇列。這個佇列在以後凱哥講For/Join框架的時候,還會說到。

七個阻塞佇列的小總結:

 

接著,我們講解了佇列中常用的四組API。

阻塞佇列四組API

會拋異常的:新增元素使用add(e),刪除元素使用remove,檢查隊首元素使用的element.

當佇列滿的時候,在向佇列中新增元素會丟擲異常;當佇列為空的時候在從佇列中刪除或者是獲取隊首元素都會丟擲異常;

帶有返回值的:新增元素:offer(e),刪除元素:poll(),檢查隊首元素:peek().

當佇列滿的時候,再呼叫offer(e)向佇列中新增元素會返回false而不是丟擲異常

當佇列為空的時候,呼叫take()或者是peek()方法返回null而不是丟擲異常

阻塞一直等待的:新增元素:put(e),刪除元素:take()

當佇列滿的時候,再向佇列中新增元素,佇列會進入阻塞狀態,直到元素新增成功為止。

當佇列為空的時候,再從佇列刪除元素,佇列會阻塞,直到能夠刪除元素為止。

帶有超時時間的阻塞:新增元素:offer(e,time,unit),刪除元素:poll(time,unit)

當佇列滿的時候,呼叫offer(e,time,unit)會進入阻塞等待中,當過來超時時間,退出等待

當佇列為空的時候,呼叫poll(time,unit)方法會進入等待狀態,當到了超時時間,會退出等待。

四組API總結:

 

關於四組API更詳細的介紹歡迎學習:《Java阻塞佇列的四組API》。在這篇文章中凱哥做了詳細的介紹。用人的一生四個階段來比擬這四組API。

到此,我們已經把Java中佇列介紹完畢。接下來,凱哥將帶著大家一起學習執行緒池。歡迎大家繼續學習。

相關推薦

Java常用阻塞佇列總結

Java佇列總結 通過前面文章的學習,我們對Java中常用佇列做了介紹。本文,咱們來對佇列做個總結吧。 首先,我們介紹了現實生活中的實際場景(排隊買票等),來告訴我們為什麼需要使用佇列。 佇列是一種先進先出(FIFO)的抽象資料結構,在Java中,佇列使用了兩種資料型別來實現的,分別是:陣列和連結串列這兩種資

Java常用阻塞佇列介紹第一篇

Java中常用的七個阻塞佇列介紹第一篇 在上一篇我們對Java中的佇列分類做了簡單的介紹。本文咱們主要來聊聊阻塞佇列中的七個常用子類。這七個阻塞佇列的學習步驟:先看原始碼,分析完原始碼之後,我們再來對每個佇列進行總結。最後在來個大總結。文章可能有點長,但是,大家耐著性子看完,保證你對這七大阻塞佇列有深刻的理解

Java常用阻塞佇列第二篇DelayQueue原始碼介紹

Java中常用的七個阻塞佇列第二篇DelayQueue原始碼介紹 通過前面兩篇文章,我們對佇列有了瞭解及已經認識了常用阻塞佇列中的三個了。本篇我們繼續介紹剩下的幾個佇列。 本文主要內容:通過原始碼學習Delayqueue及理解Dqueue並用程式碼簡單演示使用場景。 本文出自凱哥Java(kaigejava)

JAVA常用的高階集合類總結(包含Concurrent包下的併發集合類)

MAP WeakHashMap 和普通的HashMap相比,當除了自身有對key的引用外,此key沒有其他引用那麼此map會自動丟棄此值,從而解決HashMap物件中key-value資源無法釋放,導

JAVA專案常用的異常處理情況總結

1. java.lang.nullpointerexception 這個異常大家肯定都經常遇到,異常的解釋是"程式遇上了空指標",簡單地說就是呼叫了未經初始化的物件或者是不存在的物件,這個錯誤經常出現在建立圖片,呼叫陣列這些操作中,比如圖片未經初始化,或者圖片建立時的路徑錯誤等等。對陣列操作中出現空指標

Java常用的API總結

Java API是JDK所提供的使用類,這些類將底層的程式碼給封裝起來了。Object類是java語言中的根類,它所描述的所有方法子類都可以使用,所有類在建立物件的時候,最終找的父類就是Object。在Objec類中,最常見的就是euqals方法和toString方法。equals方法用於比較兩個物

Java-併發-佇列-阻塞和非阻塞佇列總結

Java-併發-佇列-阻塞和非阻塞佇列總結 轉載宣告: 本文系轉載自以下文章: Java 併發 — 阻塞佇列總結 作者: thgreat java中併發集合 作者:hy飛無 0x01 摘要 本文會對java併發包內的常用重要阻塞/非阻塞佇列進行總結。

Java 併發 --- 阻塞佇列總結

前面我們把阻塞佇列學習完了,現在過段時間來進行總結一下,也算是複習回顧知識,比較才能明白使用的場景。 ArrayBlockingQueue Java 併發 — 阻塞佇列之ArrayBlockingQueue原始碼分析 ArrayBlockingQueue

java的幾“區別”總結

1、Java中wait()和sleep()的區別 1)、方法來源:sleep()方法屬於Thread類,wait()方法屬於Object類。 2)、佔用資源:sleep=“佔著CPU睡覺”;wait=“等待使用CPU”。 sleep(100L)意思為:佔用

Java常用的鎖分析總結

Java中常用的鎖分析總結1.    ReentrantLock、ReentrantReadWriteLock及Sychronized簡介(a)  類繼承結構ReentrantLock類繼承結構:ReentrantReadWriteLick類繼承結構:簡述:通過類的繼承結構可

java的幾常用

FileOutputStream位元組輸出流 以位元組為單位將資料寫入檔案 FileInputStream位元組輸入流 以位元組為單位從檔案中讀取資料 BufferedOutputStream

Java常用的加密算法小結

單向 安全 加密算法 對稱 digest iges 公鑰加密 非對稱加密 algorithm 散列算法(單向散列,不可逆) MD5(Message Digest Algorithm 5) SHA(Secure Hash Algorithm) 對稱加密(加密解密

Java 常用的數據源

tools xml文件 安裝目錄 建立數據庫 container word classname highlight attribute 數據源:存儲了所有建立數據庫連接的信息。就象通過指定文件名你可以在文件系統中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的數據庫

C#、Java的一些小功能點總結(持續更新......)

grid datagrid item 其他 cnblogs hid roc oid sha 前言:在項目中,有時候一些小的功能點,總是容易讓人忽略,但是這些功能加在項目中往往十分的有用,因此筆者在這裏總結項目中遇到的一些實用的小功能點,以備用,並持續更新...... 1.禁

JaVa常用緩存CaCHE機制

ava lis hao123 java 緩存cache 機制 http .com list %E5%85%B3%E4%BA%8E%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0%E7%9A%84%E9%97%AE%

(轉)Unity3D常用的數據結構總結與分析

cnblogs 關於 指定 值類型 提取 聲明 數組 取消 例如 http://www.cnblogs.com/murongxiaopifu/p/4161648.html#array 1.幾種常見的數據結構 常碰到的幾種數據結構:Array,ArrayList

JAVA正則表達式學習總結

等價 regex 5.1 表示 最好 方法 system lin 劃線 一、JAVA中正則表達式相關的類 1. java.util.regex.Pattern   該類用於編譯模式,模式可以理解為一個正則表達式,比如:a*b。   用法如下:   // 創

Javathis和super的用法總結

return 類繼承 xtend chinese ati -s sha blog 定義 在JAVA類中使用super來引用父類的成分,用this來引用當前對象。 如果一個類從另外一個類繼承,我們new這個子類的實例對象的時候,這個子類對象裏面會有一個父類對象。怎麽去引用裏面

java常用jar包

中一 2.6 jdb jxl obj 串行化 分析 lean tag commons-io.jar:可以看成是java.io的擴展,用來幫助進行IO功能開發.它包含三個主要的領域:Utilityclasses-提供一些靜態方法來完成公共任務.Filters-提供文件過濾器的

JAVA常用IO流類:FileInputStream和FileOutputStream

table string [] 文件中 讀取 描述符 off fis 系統資源 FileInputStream 用於讀取本地文件中的字節數據,繼承自InputStream類 構造方法摘要 FileInputStream(File file) 通