java-BlockingQueue 使用說明

1、Java 5 添加了一個新的包到 Java 平臺,java.util.concurrent 包。這個包包含有一系列能夠讓 Java 的併發編程變得更加簡單輕鬆的類。

2、java.util.concurrent 包裏的 BlockingQueue 接口表示一個線程安全放入和提取實例的隊列。

3、BlockingQueue 接口方法如下(來自API)

4、BlockingQueue 的實現
BlockingQueue 是個接口,你需要使用它的實現之一來使用 BlockingQueue。java.util.concurrent 具有以下 BlockingQueue 接口的實現(Java 6):
● ArrayBlockingQueue
● DelayQueue
● LinkedBlockingQueue
● PriorityBlockingQueue
● SynchronousQueue

1)數組阻塞隊列 ArrayBlockingQueue
public class ArrayBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一個由數組支持的有界阻塞隊列。此隊列按 FIFO(先進先出)原則對元素進行排序。
這是一個典型的“有界緩存區”,固定大小的數組在其中保持生產者插入的元素和使用者提取的元素。一旦創建了這樣的緩存區,就不能再增加其容量。試圖向已滿隊列中放入元素會導致放入操作受阻塞;試圖從空隊列中檢索元素將導致類似阻塞。
使用示例:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("Hello World");
Object object = queue.take();
System.out.println(object);

2)延遲隊列 DelayQueue
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E>
Delayed 元素的一個無界阻塞隊列,只有在延遲期滿時才能從中提取元素。
DelayQueue 將會在每個元素的 getDelay() 方法返回的值的時間段之後才釋放掉該元素。如果返回的是 0 或者負值,延遲將被認爲過期,該元素將會在 DelayQueue 的下一次 take  被調用的時候被釋放掉。
使用示例:
public class DelayedElement implements Delayed {
@Override
public int compareTo(Delayed o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public long getDelay(TimeUnit unit) {
// TODO Auto-generated method stub
return 0;
}
}

DelayQueue queue1 = new DelayQueue();
Delayed element1 = new DelayedElement();
queue.put(element1);
Delayed element2 = (Delayed) queue.take();
System.out.println(element2);

3)鏈阻塞隊列 LinkedBlockingQueue
public class LinkedBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
LinkedBlockingQueue 內部以一個鏈式結構(鏈接節點)對其元素進行存儲。此隊列按 FIFO(先進先出)排序元素。
使用示例
BlockingQueue bounded = new LinkedBlockingQueue();
bounded.put("Hello World");
Object object1 = bounded.take();
System.out.println(object1);

4)具有優先級的阻塞隊列 PriorityBlockingQueue
public class PriorityBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一個無界的阻塞隊列,它使用與類 PriorityQueue 相同的順序規則,並且提供了阻塞檢索的操作。不允許使用 null 元素。所有插入到 PriorityBlockingQueue 的元素必須實現 java.lang.Comparable 接口。因此該隊列中元素的排序就取決於你自己的 Comparable 實現。
注意 PriorityBlockingQueue 對於具有相等優先級(compare() == 0)的元素並不強制任何特定行爲。
同時注意,如果你從一個 PriorityBlockingQueue 獲得一個 Iterator 的話,該 Iterator 並不能保證它對元素的遍歷是以優先級爲序的。

5)同步隊列 SynchronousQueue
public class SynchronousQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable
一種阻塞隊列,其中每個 put 必須等待一個 take,反之亦然。同步隊列沒有任何內部容量,甚至連一個隊列的容量都沒有。不能在同步隊列上進行 peek,因爲僅在試圖要取得元素時,該元素才存在;除非另一個線程試圖移除某個元素,否則也不能(使用任何方法)添加元素;也不能迭代隊列,因爲其中沒有元素可用於迭代。隊列的 是嘗試添加到隊列中的首個已排隊線程元素;如果沒有已排隊線程,則不添加元素並且頭爲 null。對於其他 Collection 方法(例如 contains),SynchronousQueue 作爲一個空集合。此隊列不允許 null 元素。


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