Java LinkedBlockingQueue Methods - Java 147

Java LinkedBlockingQueue Methods – Java 147

Java LinkedBlockingQueue Methods

是基於鏈結節點的可選邊界阻塞佇列,如果有給定大小,那就是固定容量,如果沒給大小就是無界佇列,實際上是 Integer.MAX_VALUE 最大值,當嘗試將元素放入已滿佇列,將會導致操作阻塞,同樣地,從空佇列中獲取元素的操作也會被阻塞, LinkedBlockingQueue Java Methods 介紹常見的 add 、 peek 、 remove 、 clear 、 size 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- queue
       |                   +- linkedblockingqueue
       |                       +- LinkedBlockingQueueWithExamplesTest.java   

單元測試

LinkedBlockingQueue Methods Java 提供新增、取得、刪除等操作佇列中的元素。

add

建立一個 LinkedBlockingQueue ,增加三個元素。

	@Test
	public void add() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
[Papaya, Strawberry, Watermelon]

addWhenFull

建立一個 LinkedBlockingQueue ,大小容量為 2,當佇列已滿時,加入第三個元素,會拋出例外。

	@Test(expected = IllegalStateException.class)
	public void addWhenFull() {
		int expectedSize = 2;
		BlockingQueue<String> queue = new LinkedBlockingQueue<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 org.ruoxue.java_147.queue.LinkedBlockingQueueMethodsTest.addWhenFull(LinkedBlockingQueueMethodsTest.java:30)

addAll

建立兩個 LinkedBlockingQueue ,內各有三個元素,合併成為一個 Queue 。

	@Test
	public void addAll() {
		int expectedSize = 6;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		BlockingQueue<String> queue2 = new LinkedBlockingQueue<String>();
		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

LinkedBlockingQueue Methods Java 建立一個 LinkedBlockingQueue 若無元素,則傳回 null ,若加入三個元素,則會取得第一個位置元素,元素並無移出佇列。

	@Test
	public void peek() {
		String expected = "Papaya";
		int expectedSize = 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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

LinkedBlockingQueue Methods Java 建立一個 LinkedBlockingQueue ,內有三個元素,取得第一個位置元素,元素並無移出佇列。

	@Test
	public void element() {
		String expected = "Papaya";
		int expectedSize = 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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

LinkedBlockingQueue Methods Java 建立一個 LinkedBlockingQueue ,當佇列為空,沒有任何元素時,取得第一個位置元素,會拋出例外。

	@Test(expected = NoSuchElementException.class)
	public void elementWhenEmpty() {
		int expectedSize = 0;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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.LinkedBlockingQueueMethodsTest.elementWhenEmpty(LinkedBlockingQueueMethodsTest.java:89)

remove

LinkedBlockingQueue Methods in Java 建立一個 LinkedBlockingQueue ,內有三個元素,刪除第一個元素及指定位置元素。

	@Test
	public void remove() {
		int expectedSize = 2;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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

LinkedBlockingQueue Methods in Java 建立一個 LinkedBlockingQueue ,當佇列為空,沒有任何元素時,移除第一個位置元素,會拋出例外。

	@Test(expected = NoSuchElementException.class)
	public void removeWhenEmpty() {
		int expectedSize = 0;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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.LinkedBlockingQueueMethodsTest.removeWhenEmpty(LinkedBlockingQueueMethodsTest.java:113)

removeAll

LinkedBlockingQueue Methods in Java 建立一個 LinkedBlockingQueue ,內有三個元素,刪除來自另一個 Queue 中的元素。

	@Test
	public void removeAll() {
		int expectedSize = 1;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		BlockingQueue<String> queue2 = new LinkedBlockingQueue<String>();
		queue2.add("Papaya");
		queue2.add("Strawberry");
		queue2.add("Pitaya");
		queue.removeAll(queue2);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
[Watermelon]

clear

LinkedBlockingQueue Methods in Java 建立一個 LinkedBlockingQueue ,內有三個元素,刪除所有元素。

	@Test
	public void clear() {
		int expectedSize = 0;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		queue.clear();
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
[]

size

建立一個 LinkedBlockingQueue ,內有三個元素,取得佇列大小。

	@Test
	public void size() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue.size());
		assertEquals(expectedSize, queue.size());
	}
3

isEmpty

建立一個 LinkedBlockingQueue ,檢查是否為空 Queue 。

	@Test
	public void isEmpty() {
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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

建立一個 LinkedBlockingQueue ,無設定容量大小,加入三個元素,取得剩餘容量。

	@Test
	public void remainingCapacity() {
		int expectedSize = Integer.MAX_VALUE - 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue.remainingCapacity());
		assertEquals(expectedSize, queue.remainingCapacity());
	}
2147483644

LinkedBlockingQueueMethodsTest.java

LinkedBlockingQueue Methods in Java 新增單元測試,驗證是否符合預期。

package org.ruoxue.java_147.queue.linkedblockingqueue;

import static org.junit.Assert.*;

import java.util.NoSuchElementException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.BlockingQueue;

import org.junit.Test;

public class LinkedBlockingQueueMethodsTest {

	@Test
	public void add() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<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 LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		BlockingQueue<String> queue2 = new LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		String value = queue.element();
		System.out.println(value);
		assertEquals(expectedSize, queue.size());
	}

	@Test
	public void remove() {
		int expectedSize = 2;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		queue.remove();
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}

	@Test
	public void removeAll() {
		int expectedSize = 1;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		BlockingQueue<String> queue2 = new LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		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 LinkedBlockingQueue<String>();
		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 = Integer.MAX_VALUE - 3;
		BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue.remainingCapacity());
		assertEquals(expectedSize, queue.remainingCapacity());
	}
}

心得分享

BlockingQueue in Java 佇列排序元素使用 FIFO 先進先出,這表示該佇列的頭部,是最舊的元素,而佇列的尾部,是最新元素,新加入的元素總是插入到佇列的尾部,檢索操作取得佇列頭部的元素,鏈結佇列通常比基於陣列的佇列具有更高的吞吐量, LinkedBlockingQueue Methods Java 提供了幾種 LinkedBlockingQueue 常見方法的操作範例。

發佈留言