10019---【Java并发之】BlockingQueue
原文
本文主要講的是并發包中涉及到的集合,關于普通集合,請參考【java 集合概覽】
一、什么是BlockingQueue
BlockingQueue即阻塞隊列,從阻塞這個詞可以看出,在某些情況下對阻塞隊列的訪問可能會造成阻塞。被阻塞的情況主要有如下兩種:1. 當隊列滿了的時候進行入隊列操作
2. 當隊列空了的時候進行出隊列操作
因此,當一個線程試圖對一個已經滿了的隊列進行入隊列操作時,它將會被阻塞,除非有另一個線程做了出隊列操作;同樣,當一個線程試圖對一個空隊列進行出隊列操作時,它將會被阻塞,除非有另一個線程進行了入隊列操作。
在Java中,BlockingQueue的接口位于java.util.concurrent 包中(在Java5版本開始提供),由上面介紹的阻塞隊列的特性可知,阻塞隊列是線程安全的。
二、BlockingQueue的用法
阻塞隊列主要用在生產者/消費者的場景,下面這幅圖展示了一個線程生產、一個線程消費的場景:
? ? ? ?負責生產的線程不斷的制造新對象并插入到阻塞隊列中,直到達到這個隊列的上限值。隊列達到上限值之后生產線程將會被阻塞,直到消費的線程對這個隊列進行消費。同理,負責消費的線程不斷的從隊列中消費對象,直到這個隊列為空,當隊列為空時,消費線程將會被阻塞,除非隊列中有新的對象被插入。
三、BlockingQueue接口中的方法
阻塞隊列一共有四套方法分別用來進行insert、remove和examine,當每套方法對應的操作不能馬上執行時會有不同的反應,下面這個表格就分類列出了這些方法:?
這四套方法對應的特點分別是:
1. ThrowsException:如果操作不能馬上進行,則拋出異常
2. SpecialValue:如果操作不能馬上進行,將會返回一個特殊的值,一般是true或者false
3. Blocks:如果操作不能馬上進行,操作會被阻塞
4. TimesOut:如果操作不能馬上進行,操作會被阻塞指定的時間,如果指定時間沒執行,則返回一個特殊值,一般是true或者false
需要注意的是,我們不能向BlockingQueue中插入null,否則會報NullPointerException。
四、BlockingQueue的實現類
BlockingQueue只是java.util.concurrent包中的一個接口,而在具體使用時,我們用到的是它的實現類,當然這些實現類也位于java.util.concurrent包中。在Java6中,BlockingQueue的實現類主要有以下幾種:
1. ArrayBlockingQueue 2. DelayQueue 3. LinkedBlockingQueue 4. PriorityBlockingQueue 5. SynchronousQueue下面我們就分別介紹這幾個實現類。
4.1 ArrayBlockingQueue
? ? ? ? ArrayBlockingQueue是一個有邊界的阻塞隊列,它的內部實現是一個數組。有邊界的意思是它的容量是有限的,我們必須在其初始化的時候指定它的容量大小,容量大小一旦指定就不可改變。? ? ? ? ArrayBlockingQueue是以先進先出(FIFO)的方式存儲數據,最新插入的對象是尾部,最新移出的對象是頭部。下面是一個初始化和使用ArrayBlockingQueue的例子:
BlockingQueue queue = new ArrayBlockingQueue(1024); queue.put("1"); Object object = queue.take();
4.2 DelayQueue
DelayQueue阻塞的是其內部元素,DelayQueue中的元素必須實現 java.util.concurrent.Delayed接口,這個接口的定義非常簡單:總結
以上是生活随笔為你收集整理的10019---【Java并发之】BlockingQueue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 12 个华丽的 UI 组件,为您提供设计
- 下一篇: RobotFrameWork Web自动