類ArrayBlockingQueue是BlockingQueue接口的實現類,它是有界的阻塞隊列,內部使用數組存儲隊列元素。這里的“有界”是指存儲容量存在上限,不能無限存儲元素。在同一時間內存儲容量存在着一個上限值,這個上限制在初始實例化的時候指定,之后便不能修改了。
ArrayBlockingQueue內部采用FIFO (First In, First Out)先進先出的方法實現隊列數據的存取,隊首的元素是在隊列中保存時間最長的元素對象,隊尾的元素是在隊列中保存時間最短的元素對象。
下面的代碼說明如何初始化一個ArrayBlockingQueue,並向其中添加一個對象:
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1"); //向隊列中添加元素
Object object = queue.take(); //從隊列中取出元素
BlockingQueue可以通過泛型來限定隊列中存儲數據的類型,下面的代碼以String為泛型,表示該隊列只能存儲String類型。
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();
實現一個生產消費的實例
在前面的文章中我們曾經講過:BlockingQueue經常被用於生產消費的緩沖隊列。下面我們就使用ArrayBlockingQueue來真正的實現一個生產消費的例子。
類BlockingQueueExample開啟兩個獨立線程,一個是Producer生產者線程,負責向隊列中添加數據;另一個是Consumer消費者線程,負責從隊列中取出數據進行處理。
public class BlockingQueueExample {
public static void main(String[] args) throws Exception {
//使用ArrayBlockingQueue初始化一個BlockingQueue,指定容量的上限為1024
BlockingQueue queue = new ArrayBlockingQueue(1024);
Producer producer = new Producer(queue); //生產者
Consumer consumer = new Consumer(queue); //消費者
new Thread(producer).start(); //開啟生產者線程
new Thread(consumer).start(); //開啟消費者線程
Thread.sleep(4000);
}
}
類Producer為生產者,每隔10秒鍾使用put()方法向隊列中放入一個對象,放入三次。在這10秒的間隔內,隊列數據被消費者取走之后將導致消費者線程阻塞。
public class Producer implements Runnable{
protected BlockingQueue queue = null;
public Producer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
queue.put("1");
Thread.sleep(10000);
queue.put("2");
Thread.sleep(10000);
queue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
下面的代碼是消費者類Consumer,它從隊列中獲取待處理的元素對象,並調用System.out將其打印出來。
public class Consumer implements Runnable{
protected BlockingQueue queue = null;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
public void run() {
try {
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面的代碼打印結果是每隔10秒打印一次,因為其中take()方法在隊列內沒有元素可以取到的時候,會阻塞當前的消費者線程,讓其處於等待狀態,這個方法我們在上一節介紹BlockingQueue的時候就已經進行過說明。
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。
