ArrayBlockingQueue in Java with Examples - Java 147

ArrayBlockingQueue in Java with Examples – Java 147

ArrayBlockingQueue in Java with Examples - Java 147

提供了使用陣列的阻塞佇列實現,被認為是執行緒安全的集合,因此,通常用於多執行緒的應用程式,假設,一個執行緒正在向佇列中插入元素,而另一個執行緒正在從佇列中移除元素,如果第一個執行緒比第二個執行緒慢,那麼阻塞佇列可以讓第二個執行緒等待,直到第一個執行緒完成操作, Java ArrayBlockingQueue Examples 介紹常見的 forEach 、 iterator 、 spliterator 、 trySplit 、 drainTo 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- queue
       |                   +- arrayblockingqueue
       |                       +- ArrayBlockingQueueWithExamplesTest.java   

單元測試

Java Blocking Queue 提供循環訪問、佇列匯出、轉成陣列等操作列表中的元素。

forEach

建立一個 ArrayBlockingQueue ,內有三個元素,迴圈取得元素。

	@Test
	public void forEach() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		queue.forEach(e -> System.out.println(e));
	}
Papaya
Strawberry
Watermelon

forEachRemaining

建立一個 ArrayBlockingQueue ,內有三個元素,迴圈取得剩餘元素。

	@Test
	public void forEachRemaining() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Iterator<String> it = queue.iterator();
		int i = 0;
		while (it.hasNext()) {
			System.out.println(it.next());
			if (i == 1) {
				break;
			}
			i++;
		}
		System.out.println("----------");
		it.forEachRemaining(e -> {
			System.out.println(e);
		});
	}
Papaya
Strawberry
----------
Watermelon

iterator

Java Blocking Queue 建立一個 ArrayBlockingQueue ,內有三個元素,迴圈取得元素。

	@Test
	public void iterator() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Iterator<String> it = queue.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
Papaya
Strawberry
Watermelon

spliterator

Java Blocking Queue 建立一個 ArrayBlockingQueue ,內有三個元素,使用 spliterator 取得元素,等同於 iterator.hasNext 和 iterator.next。

	@Test
	public void spliterator() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Spliterator<String> sit = queue.spliterator();
		sit.tryAdvance(e -> System.out.println(e));
		System.out.println("----------");
		sit.forEachRemaining(e -> System.out.println(e));

		System.out.println("----------");
		sit = queue.spliterator();
		while (sit.tryAdvance(e -> System.out.println(e))) {
		}
	}
Papaya
----------
Strawberry
Watermelon
----------
Papaya
Strawberry
Watermelon

trySplit

Java Blocking Queue 建立一個 ArrayBlockingQueue ,內有三個元素,使用 spliterator 取得元素,trySplit 將目前的拆分器分為兩個新的拆分器並行處理。

	@Test
	public void trySplit() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Spliterator<String> sit = queue.spliterator();
		Spliterator<String> sit2 = sit.trySplit();
		System.out.println(sit.getExactSizeIfKnown());
		sit.forEachRemaining(e -> System.out.println(e));

		System.out.println("----------");
		System.out.println(sit2.getExactSizeIfKnown());
		sit2.forEachRemaining(e -> System.out.println(e));
	}
-1
----------
3
Papaya
Strawberry
Watermelon

toArray

Java ArrayBlockingQueue 建立一個 ArrayBlockingQueue ,內有三個元素, 轉換成 String 陣列。

	@Test
	public void toArray() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		String[] array = new String[queue.size()];
		queue.toArray(array);
		for (String e : array) {
			System.out.println(e);
		}
		assertEquals(expectedSize, array.length);
	}
Papaya
Strawberry
Watermelon

streamToArray

Java ArrayBlockingQueue 建立一個 ArrayBlockingQueue ,內有三個元素,使用 Stream ,轉換成 String 陣列。

	@Test
	public void streamToArray() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		String[] array = queue.stream().toArray(String[]::new);
		for (String e : array) {
			System.out.println(e);
		}
		assertEquals(expectedSize, array.length);
	}
Papaya
Strawberry
Watermelon

drainTo

建立一個 ArrayBlockingQueue ,內有三個元素,元素全部匯出到另一個佇列。

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

drainToMaxElements

建立一個 ArrayBlockingQueue ,內有三個元素,匯出指定數量元素到另一個佇列。

    @Test
	public void drainToMaxElements() {
		int expectedSize = 2;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue);
		BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
		queue.drainTo(queue2, 1);
		System.out.println(queue);
		System.out.println(queue2);
		assertEquals(expectedSize, queue.size());
		assertEquals(1, queue2.size());
	}
[Papaya, Strawberry, Watermelon]
[Strawberry, Watermelon]
[Papaya]

ArrayBlockingQueueWithExamplesTest.java

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

package org.ruoxue.java_147.queue.arrayblockingqueue;

import static org.junit.Assert.*;

import java.util.Iterator;
import java.util.Spliterator;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

import org.junit.Test;

public class ArrayBlockingQueueWithExamplesTest {

	@Test
	public void forEach() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		queue.forEach(e -> System.out.println(e));
	}

	@Test
	public void forEachRemaining() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Iterator<String> it = queue.iterator();
		int i = 0;
		while (it.hasNext()) {
			System.out.println(it.next());
			if (i == 1) {
				break;
			}
			i++;
		}
		System.out.println("----------");
		it.forEachRemaining(e -> {
			System.out.println(e);
		});
	}

	@Test
	public void iterator() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Iterator<String> it = queue.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

	@Test
	public void spliterator() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Spliterator<String> sit = queue.spliterator();
		sit.tryAdvance(e -> System.out.println(e));
		System.out.println("----------");
		sit.forEachRemaining(e -> System.out.println(e));

		System.out.println("----------");
		sit = queue.spliterator();
		while (sit.tryAdvance(e -> System.out.println(e))) {
		}
	}

	@Test
	public void trySplit() {
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		Spliterator<String> sit = queue.spliterator();
		Spliterator<String> sit2 = sit.trySplit();
		System.out.println(sit.getExactSizeIfKnown());
		sit.forEachRemaining(e -> System.out.println(e));

		System.out.println("----------");
		System.out.println(sit2.getExactSizeIfKnown());
		sit2.forEachRemaining(e -> System.out.println(e));
	}

	@Test
	public void toArray() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		String[] array = new String[queue.size()];
		queue.toArray(array);
		for (String e : array) {
			System.out.println(e);
		}
		assertEquals(expectedSize, array.length);
	}

	@Test
	public void streamToArray() {
		int expectedSize = 3;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		String[] array = queue.stream().toArray(String[]::new);
		for (String e : array) {
			System.out.println(e);
		}
		assertEquals(expectedSize, array.length);
	}

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

	@Test
	public void drainToMaxElements() {
		int expectedSize = 2;
		BlockingQueue<String> queue = new ArrayBlockingQueue<String>(10);
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		System.out.println(queue);
		BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(10);
		queue.drainTo(queue2, 1);
		System.out.println(queue);
		System.out.println(queue2);
		assertEquals(expectedSize, queue.size());
		assertEquals(1, queue2.size());
	}
}

心得分享

Java BlockingQueue Examples 希望阻塞兩個或多個執行緒對單個資源的操作,使用容量限制因子來阻塞線程, 是 Java 集合框架的成員之一,通常用於多執行緒的應用程式,Java ArrayBlockingQueue 提供了幾種 ArrayBlockingQueue 常見方法的操作範例。

發佈留言