Table of Contents
ToggleJava 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 常見方法的操作範例。