Java ConcurrentLinkedQueue Class - Java 147

Java ConcurrentLinkedQueue Class – Java 147

Java ConcurrentLinkedQueue Class - Java 147

執行緒安全鏈結非阻塞佇列,當佇列為空時,不會阻塞執行緒,通常用於多執行緒的應用程式,佇列會隨著元素的增加而動態成長, ConcurrentLinkedQueue Class in Java 介紹常見的 offer 、 poll 、 put 、 take 、 contains 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- queue
       |                   +- concurrentlinkedqueue
       |                       +- ConcurrentLinkedQueueClassTest.java  

單元測試

ConcurrentLinkedQueue java 提供新增、取得、檢查包含、串流操作佇列中的元素。

offer

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

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

poll

ConcurrentLinkedQueue java 建立一個 ConcurrentLinkedQueue ,內有三個元素,取得第一個位置元素,元素會移出佇列。

	public void poll() {
		int expectedSize = 2;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.offer("Papaya");
		queue.offer("Strawberry");
		queue.offer("Watermelon");
		String value = queue.poll();
		System.out.println(value);
		assertNotNull(value);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
Papaya
[Strawberry, Watermelon]

pollWhenEmpty

ConcurrentLinkedQueue java 建立一個 ConcurrentLinkedQueue ,當佇列為空,沒有任何元素時,取得第一個位置元素,會傳回 null 。

	@Test
	public void pollWhenEmpty() {
		int expectedSize = 0;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		String value = queue.poll();
		System.out.println(value);
		assertNull(value);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
null
[]

contains

Queues Java 建立一個 ConcurrentLinkedQueue ,內有三個元素,檢查包含指定的元素。

	@Test
	public void contains() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		boolean contains = queue.contains("Papaya");
		System.out.println(contains);
		assertTrue(contains);

		contains = queue.contains("Grape");
		System.out.println(contains);
		assertFalse(contains);
	}
true
false

containsAll

Queues Java 建立一個 ConcurrentLinkedQueue ,內有三個元素,查包含所有指定的元素。

	@Test
	public void containsAll() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		Queue<String> queue2 = new ConcurrentLinkedQueue<String>();
		queue2.add("Papaya");
		queue2.add("Strawberry");

		boolean contains = queue.containsAll(queue2);
		System.out.println(contains);
		assertTrue(contains);

		contains = queue2.containsAll(queue);
		System.out.println(contains);
		assertFalse(contains);
	}
true
false

stream

建立一個 ConcurrentLinkedQueue ,內有三個元素,執行串流,取得長度大於 6 的元素。

	@Test
	public void stream() {
		int expectedSize = 2;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		List<String> list = queue.stream().filter(e -> e.length() > 6).collect(Collectors.toList());
		System.out.println(list);
		assertEquals(expectedSize, list.size());
	}
[Strawberry, Watermelon]

parallelStream

建立一個 ConcurrentLinkedQueue ,內有三個元素,並行執行串流。

	@Test
	public void parallelStream() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		queue.parallelStream().forEach(System.out::println);
		System.out.println("----------");
		queue.parallelStream().forEachOrdered(System.out::println);
	}
Strawberry
Papaya
Watermelon
----------
Papaya
Strawberry
Watermelon

retainAll

建立一個 ConcurrentLinkedQueue ,內各有三個元素,只保留相同元素。

	@Test
	public void retainAll() {
		int expectedSize = 1;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		Queue<String> queue2 = new ConcurrentLinkedQueue<String>();
		queue2.add("Papaya");
		queue2.add("Lemon");
		queue2.add("Mango");

		queue.retainAll(queue2);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
[Papaya]

ConcurrentLinkedQueueClassTest.java

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

package org.ruoxue.java_147.queue.concurrentlinkedqueue;

import static org.junit.Assert.*;

import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.stream.Collectors;

import org.junit.Test;

public class ConcurrentLinkedQueueClassTest {

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

	@Test
	public void poll() {
		int expectedSize = 2;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.offer("Papaya");
		queue.offer("Strawberry");
		queue.offer("Watermelon");
		String value = queue.poll();
		System.out.println(value);
		assertNotNull(value);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}

	@Test
	public void pollWhenEmpty() {
		int expectedSize = 0;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		String value = queue.poll();
		System.out.println(value);
		assertNull(value);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}

	@Test
	public void contains() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		boolean contains = queue.contains("Papaya");
		System.out.println(contains);
		assertTrue(contains);

		contains = queue.contains("Grape");
		System.out.println(contains);
		assertFalse(contains);
	}

	@Test
	public void containsAll() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		Queue<String> queue2 = new ConcurrentLinkedQueue<String>();
		queue2.add("Papaya");
		queue2.add("Strawberry");

		boolean contains = queue.containsAll(queue2);
		System.out.println(contains);
		assertTrue(contains);

		contains = queue2.containsAll(queue);
		System.out.println(contains);
		assertFalse(contains);
	}

	@Test
	public void stream() {
		int expectedSize = 2;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		List<String> list = queue.stream().filter(e -> e.length() > 6).collect(Collectors.toList());
		System.out.println(list);
		assertEquals(expectedSize, list.size());
	}

	@Test
	public void parallelStream() {
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");
		queue.parallelStream().forEach(System.out::println);
		System.out.println("----------");
		queue.parallelStream().forEachOrdered(System.out::println);
	}

	@Test
	public void retainAll() {
		int expectedSize = 1;
		Queue<String> queue = new ConcurrentLinkedQueue<String>();
		queue.add("Papaya");
		queue.add("Strawberry");
		queue.add("Watermelon");

		Queue<String> queue2 = new ConcurrentLinkedQueue<String>();
		queue2.add("Papaya");
		queue2.add("Lemon");
		queue2.add("Mango");

		queue.retainAll(queue2);
		System.out.println(queue);
		assertEquals(expectedSize, queue.size());
	}
}

心得分享

ConcurrentLinkedQueue in Java 當佇列為空時,讀取元素,不會阻塞執行緒,會傳回 null 值,佇列的頭部,是最舊的元素,而佇列的尾部,是最新元素,以排隊的人為例,第一個加入排隊的人,將首先完成其工作, Queues Java 提供了幾種 ConcurrentLinkedQueue 常見方法的操作範例。

發佈留言