package org.springside.modules.utils.collection; import java.util.ArrayDeque; import java.util.Collections; import java.util.Deque; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingQueue; import com.google.common.collect.EvictingQueue; /** * Queue工具集. * * 1.各种Queue,Dequeue的创建 * * 2.特殊类型Queue:LIFO的Stack, LRU的Queue */ public class QueueUtil { /** * 创建ArrayDeque (JDK无ArrayQueue) * * 需设置初始长度,默认为16,数组满时成倍扩容 */ public static <E> ArrayDeque<E> newArrayDeque(int initSize) { return new ArrayDeque<E>(initSize); } /** * 创建LinkedDeque (LinkedList实现了Deque接口) */ public static <E> LinkedList<E> newLinkedDeque() { return new LinkedList<E>(); } /** * 创建无阻塞情况下,性能最优的并发队列 */ public static <E> ConcurrentLinkedQueue<E> newConcurrentNonBlockingQueue() { return new ConcurrentLinkedQueue<E>(); } /** * 创建无阻塞情况下,性能最优的并发双端队列 */ public static <E> Deque<E> newConcurrentNonBlockingDeque() { return new java.util.concurrent.ConcurrentLinkedDeque<E>(); } /** * 创建并发阻塞情况下,长度不受限的队列. * * 长度不受限,即队列不会因为满而阻塞,但会因为空而阻塞. */ public static <E> LinkedBlockingQueue<E> newBlockingUnlimitQueue() { return new LinkedBlockingQueue<E>(); } /** * 创建并发阻塞情况下,长度不受限的双端队列. * * 长度不受限,即队列不会因为满而阻塞,但会因为空而阻塞. */ public static <E> LinkedBlockingDeque<E> newBlockingUnlimitDeque() { return new LinkedBlockingDeque<E>(); } /** * 创建并发阻塞情况下,长度受限,更节约内存,但共用一把锁的队列(无双端队列实现). */ public static <E> ArrayBlockingQueue<E> newArrayBlockingQueue(int capacity) { return new ArrayBlockingQueue<E>(capacity); } /** * 创建并发阻塞情况下,长度受限,头队尾两把锁, 但使用更多内存的队列. */ public static <E> LinkedBlockingQueue<E> newLinkedBlockingQeque(int capacity) { return new LinkedBlockingQueue<E>(capacity); } /** * 创建并发阻塞情况下,长度受限,头队尾两把锁, 但使用更多内存的双端队列. */ public static <E> LinkedBlockingDeque<E> newBlockingDeque(int capacity) { return new LinkedBlockingDeque<E>(capacity); } //////////////// 特殊类型Queue:Stack /////////// /** * 支持后进先出的栈,用ArrayDeque实现, 经过Collections#asLifoQueue()转换顺序 * * 需设置初始长度,默认为16,数组满时成倍扩容 * * @see Collections#asLifoQueue() */ public static <E> Queue<E> createStack(int initSize) { return Collections.asLifoQueue(new ArrayDeque<E>(initSize)); } /** * 支持后进先出的并发栈,用ConcurrentLinkedDeque实现,经过Collections#asLifoQueue()转换顺序 * * 另对于BlockingQueue接口, JDK暂无Lifo倒转实现,因此只能直接使用未调转顺序的LinkedBlockingDeque * * @see Collections#asLifoQueue() */ public static <E> Queue<E> createConcurrentStack() { return (Queue<E>) Collections.asLifoQueue(newConcurrentNonBlockingDeque()); } //////////////// 特殊类型Queue:LRUQueue /////////// /** * LRUQueue, 如果Queue已满,则删除最旧的元素. * * 内部实现是ArrayDeque */ public static <E> EvictingQueue<E> createLRUQueue(int maxSize) { return EvictingQueue.create(maxSize); } }