Table of Contents
ToggleJava ArrayBlockingQueue Methods
是由陣列支援的有界阻塞佇列,所謂有界,就是說 Queue 的大小是固定的,一旦建立固定容量的佇列,就便無法再更改,當嘗試將元素放入已滿佇列,將會導致操作阻塞,同樣地,從空佇列中獲取元素的操作也會被阻塞, ArrayBlockingQueue Java Methods 介紹常見的 add 、 peek 、 remove 、 clear 、 size 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- queue
| +- arrayblockingqueue
| +- ArrayBlockingQueueMethodsTest.java
單元測試
ArrayBlockingQueue Methods Java 提供新增、取得、刪除等操作佇列中的元素。
add
建立一個 ArrayBlockingQueue ,增加三個元素。
@Test
public void add() {
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
[Papaya, Strawberry, Watermelon]
addWhenFull
建立一個 ArrayBlockingQueue ,大小容量為 2,當佇列已滿時,加入第三個元素,會拋出例外。
@Test(expected = IllegalStateException.class)
public void addWhenFull() {
int expectedSize = 2;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
java.lang.IllegalStateException: Queue full
at java.util.AbstractQueue.add(AbstractQueue.java:98)
at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:312)
at org.ruoxue.java_147.queue.ArrayBlockingQueueMethodsTest.addWhenFull(ArrayBlockingQueueMethodsTest.java:30)
addAll
建立兩個 ArrayBlockingQueue ,內各有三個元素,合併成為一個 Queue 。
@Test
public void addAll() {
int expectedSize = 6;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
queue2.add("Durian");
queue2.add("Guava");
queue2.add("Pitaya");
queue.addAll(queue2);
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
[Papaya, Strawberry, Watermelon, Durian, Guava, Pitaya]
peek
ArrayBlockingQueue Methods Java 建立一個 ArrayBlockingQueue 若無元素,則傳回 null ,若加入三個元素,則會取得第一個位置元素,元素並無移出佇列。
@Test
public void peek() {
String expected = "Papaya";
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
String value = queue.peek();
System.out.println(value);
assertEquals(null, value);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
value = queue.peek();
System.out.println(value);
assertEquals(expected, value);
assertEquals(expectedSize, queue.size());
}
null
Papaya
element
ArrayBlockingQueue Methods Java 建立一個 ArrayBlockingQueue ,內有三個元素,取得第一個位置元素,元素並無移出佇列。
@Test
public void element() {
String expected = "Papaya";
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
String value = queue.element();
System.out.println(value);
assertEquals(expected, value);
assertEquals(expectedSize, queue.size());
}
Papaya
elementWhenEmpty
ArrayBlockingQueue Methods Java 建立一個 ArrayBlockingQueue ,當佇列為空,沒有任何元素時,取得第一個位置元素,會拋出例外。
@Test(expected = NoSuchElementException.class)
public void elementWhenEmpty() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
String value = queue.element();
System.out.println(value);
assertEquals(expectedSize, queue.size());
}
java.util.NoSuchElementException
at java.util.AbstractQueue.element(AbstractQueue.java:136)
at org.ruoxue.java_147.queue.ArrayBlockingQueueMethodsTest.elementWhenEmpty(ArrayBlockingQueueMethodsTest.java:85)
remove
ArrayBlockingQueue Methods in Java 建立一個 ArrayBlockingQueue ,內有三個元素,刪除第一個元素及指定位置元素。
public void remove() {
int expectedSize = 2;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
queue.remove();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
queue.remove("Watermelon");
System.out.println(queue);
assertEquals(1, queue.size());
}
[Strawberry, Watermelon]
[Strawberry]
removeWhenEmpty
ArrayBlockingQueue Methods in Java 建立一個 ArrayBlockingQueue ,當佇列為空,沒有任何元素時,移除第一個位置元素,會拋出例外。
@Test(expected = NoSuchElementException.class)
public void removeWhenEmpty() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.remove();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
java.util.NoSuchElementException
at java.util.AbstractQueue.remove(AbstractQueue.java:117)
at org.ruoxue.java_147.queue.ArrayBlockingQueueMethodsTest.removeWhenEmpty(ArrayBlockingQueueMethodsTest.java:109)
removeAll
ArrayBlockingQueue Methods in Java 建立一個 ArrayBlockingQueue ,內有三個元素,刪除來自另一個 Queue 中的元素。
@Test
public void removeAll() {
int expectedSize = 1;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
queue2.add("Papaya");
queue2.add("Strawberry");
queue2.add("Pitaya");
queue.removeAll(queue2);
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
[Watermelon]
clear
ArrayBlockingQueue Methods in Java 建立一個 ArrayBlockingQueue ,內有三個元素,刪除所有元素。
@Test
public void clear() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
queue.clear();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
[]
size
建立一個 ArrayBlockingQueue ,內有三個元素,取得佇列大小。
@Test
public void size() {
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.size());
assertEquals(expectedSize, queue.size());
}
3
isEmpty
建立一個 ArrayBlockingQueue ,檢查是否為空 Queue 。
@Test
public void isEmpty() {
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
System.out.println(queue.isEmpty());
assertTrue(queue.isEmpty());
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.isEmpty());
assertFalse(queue.isEmpty());
}
true
false
remainingCapacity
建立一個 ArrayBlockingQueue ,大小容量為 10,加入三個元素,取得剩餘容量。
@Test
public void remainingCapacity() {
int expectedSize = 7;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.remainingCapacity());
assertEquals(expectedSize, queue.remainingCapacity());
}
7
ArrayBlockingQueueMethodsTest.java
ArrayBlockingQueue Methods in Java 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.queue.arrayblockingqueue;
import static org.junit.Assert.*;
import java.util.NoSuchElementException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import org.junit.Test;
public class ArrayBlockingQueueMethodsTest {
@Test
public void add() {
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test(expected = IllegalStateException.class)
public void addWhenFull() {
int expectedSize = 2;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void addAll() {
int expectedSize = 6;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
queue2.add("Durian");
queue2.add("Guava");
queue2.add("Pitaya");
queue.addAll(queue2);
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void peek() {
String expected = "Papaya";
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
String value = queue.peek();
System.out.println(value);
assertEquals(null, value);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
value = queue.peek();
System.out.println(value);
assertEquals(expected, value);
assertEquals(expectedSize, queue.size());
}
@Test
public void element() {
String expected = "Papaya";
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
String value = queue.element();
System.out.println(value);
assertEquals(expected, value);
assertEquals(expectedSize, queue.size());
}
@Test(expected = NoSuchElementException.class)
public void elementWhenEmpty() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
String value = queue.element();
System.out.println(value);
assertEquals(expectedSize, queue.size());
}
@Test
public void remove() {
int expectedSize = 2;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
queue.remove();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
queue.remove("Watermelon");
System.out.println(queue);
assertEquals(1, queue.size());
}
@Test(expected = NoSuchElementException.class)
public void removeWhenEmpty() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.remove();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void removeAll() {
int expectedSize = 1;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
queue2.add("Papaya");
queue2.add("Strawberry");
queue2.add("Pitaya");
queue.removeAll(queue2);
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void clear() {
int expectedSize = 0;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
queue.clear();
System.out.println(queue);
assertEquals(expectedSize, queue.size());
}
@Test
public void size() {
int expectedSize = 3;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.size());
assertEquals(expectedSize, queue.size());
}
@Test
public void isEmpty() {
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
System.out.println(queue.isEmpty());
assertTrue(queue.isEmpty());
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.isEmpty());
assertFalse(queue.isEmpty());
}
@Test
public void remainingCapacity() {
int expectedSize = 7;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
queue.add("Papaya");
queue.add("Strawberry");
queue.add("Watermelon");
System.out.println(queue.remainingCapacity());
assertEquals(expectedSize, queue.remainingCapacity());
}
}
心得分享
Blocking Queue in Java 一般用在執行緒安全的環境中,希望阻塞兩個或多個對單個資源的操作,只允許一個執行緒操作,使用 FIFO 先進先出的方式, ArrayBlockingQueue Methods Java 提供了幾種 ArrayBlockingQueue 常見方法的操作範例。