Queue 的資料結構是先進先出,例如依序把 message1、message2、message3 放入到 Queue 時,讀取出來的順序也會從 message1、message2、message3 按照放入的順序讀取出來。Java 有提供執行緒安全的 Queue 實作,主要有 LinkedBlockingQueue 和 ConcurrentLinkedQueue 它們之間的差別其實可以從 class 的名稱看出來 LinkedBlockingQueue 屬於 Blocking (阻塞) 而 ConcurrentLinkedQueue 則是 NonBlocking (非阻塞),要選擇使用哪一種 Queue 可以依照不同的使用情境來決定。
操作 LinkedBlockinQueue的方式,有把資料加入到 Queue 裡、取出 Queue 的資料內容和檢查 Queue 裡面元素的值,今天就先來介紹如何把資料放入到 Queue 裡。
把資料加入到 Queue,可以呼叫 add、put、offer 三種的方法,每一種的方法都有不同的地方,以下分別用 Sample Code 來介紹:
1.呼叫 add 方法
import java.util.concurrent.LinkedBlockingQueue;
public class AddQueueExample {
public static void main(String args[]) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
boolean a = queue.add("aaa");
System.out.println(a);
boolean b = queue.add("bbb");
System.out.println(b);
boolean c = queue.add("ccc");
System.out.println(c);
}
}
以上的程式限制 Queue 只能放入 2 個元素,並且呼叫 add 方法來放入資料的內容,執行結果如下:
true
true
Exception in thread "main" java.lang.IllegalStateException: Queue full
at java.util.AbstractQueue.add(AbstractQueue.java:98)
at AddQueueExample.main(AddQueueExample.java:11)
從以上的執行結果可以看到,當資料成功的加入到 Queue 時會回傳 true,如果超出 Queue 的範圍還呼叫 add 方法時,就會收到 Queue 已經滿了的錯誤訊息。
2.呼叫 put 方法
import java.util.concurrent.LinkedBlockingQueue;
public class PutQueueExample {
public static void main(String args[]) throws Exception {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
queue.put("aaa");
queue.put("bbb");
queue.put("ccc");
}
}
使用 put 方法它的傳回值是 void,因此就沒有印出結果。這個程式最主要是當Queue 加入到超出範圍 2 個元素時,程式就會被阻塞住,等待 Queue 有足夠的空間之後才會執行。這個 Sample Code 要實際去執行才比較容易理解。
3.呼叫 offer 方法
import java.util.concurrent.LinkedBlockingQueue;
public class OfferQueueExample {
public static void main(String args[]) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
boolean a = queue.offer("aaa");
System.out.println(a);
boolean b = queue.offer("bbb");
System.out.println(b);
boolean c = queue.offer("ccc");
System.out.println(c);
}
}
以上的程式是使用呼叫 offer 的方法來把資料加入到 Queue 裡面,執行結果如下:
true
true
false
從以上的結果可以看出使用呼叫 offer 的方式,資料成功放入到 Queue 時會回傳 true,如果 Queue 已經滿了的話就會傳回 false 的狀態。
明天還會繼續介紹如何使用LinkedBlockingQueue 的 class 把資料取出以及檢查元素的部份。