队列的阻塞插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满
队列的阻塞移除:当队列为空时,获取元素的线程会等待队列变为非空
BlockingQueue提供的方法如下,其中put和take是阻塞操作
操作方法 抛出异常 返回特殊值 阻塞线程 超时退出
插入元素 add(e) offer(e) put(e) offer(e, timeout, unit)
移除元素 remove() poll() take() pull(timeout, unit)
检查 element() peek() 无 无
ArrayBlockingQueue
ArrayBlockingQueue是用数组实现的有界阻塞队列,必须指定队列大小,先进先出(FIFO)原则排队
LinkedBlockingQueue
是用链表实现的有界阻塞队列,如果构造LinkedBlockingQueue时没有指定大小,则默认是Integer.MAX_VALUE,无限大
该队列生产端和消费端使用独立的锁来控制数据操作,以此来提高队列的并发性
PriorityBlockingQueue
public PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator)
基于数组,元素具有优先级的无界阻塞队列,优先级由Comparator决定
PriorityBlockingQueue不会阻塞生产者,却会在没有可消费的任务时,阻塞消费者
DelayQueue
支持延时获取元素的无界阻塞队列,基于PriorityQueue实现
元素必须实现Delayed接口,指定多久才能从队列中获取该元素。
可用于缓存系统的设计、定时任务调度等场景的使用
SynchronousQueue
SynchronousQueue是一种无缓冲的等待队列,添加一个元素必须等待被取走后才能继续添加元素
LinkedTransferQueue
由链表组成的TransferQueue无界阻塞队列,相比其他队列多了tryTransfer和transfer函数
transfer:当前有消费者正在等待元素,则直接传给消费者,否则存入队尾,并阻塞等待元素被消费才返回
tryTransfer:试探传入的元素是否能直接传给消费者。如果没消费者等待消费元素,元素加入队尾,返回false
LinkedBlockingDeque
LinkedBlockingDeque是由链表构建的双向阻塞队列,多了一端可操作入队出队,少了一半的竞争,提高并发性