1. BlockingQueue
- 是一个支持两个附加操作的队列。这两个附加操作就是支持阻塞的插入和移除操作。常用语生产者-消费者模式中。若是无界阻塞队列,队列不可能出现满的情况,所有使用put和offer的时候永远不会被阻塞。
2. java中的阻塞队列
- ArrayBlockingQueue:是一个数组实现的有界阻塞队列。按照FIFO对元素排序。默认是不公平的访问队列。
- API:
- 增加元素。
- add: 超过了设置的队列大小,抛出
IllegalArgumentException
异常; - offer:超过了队列大小,则会false,插入成功返回true。不会抛出异常。
- put:超过队列大小会阻塞队列,可以被
interrupt
。
- add: 超过了设置的队列大小,抛出
- 获取元素
- poll:根据FIFO的规则获取队列元素,且删除队列中此元素,若是队列中没有数据了,则返回
null
。 - peek:只是会获取第一个元素,但是获取之后,不会删除元素。
- element:底层调用peek方法,但是,若是队列中没有元素时,会抛出
NoSuchElementException
。 - remove:底层调用了poll方法,但是,若是队列中没有元素时,会抛出
NoSuchElementException
。 - drainTo(Collections ):把队列中全部元素都放入到参数集合中,并清空队列。
- poll:根据FIFO的规则获取队列元素,且删除队列中此元素,若是队列中没有数据了,则返回
- 增加元素。
- API:
- LinkedBlockingQueue:是一个链表实现的有界阻塞队列。此队列的默认和最大长度的Integer.MAX_VALUE。 也是FIFO。
- PriorityBlockingQueue:是一个支持优先级的无界阻塞队列。默认采用自然顺序升序排序。也可以自定义
compareTo()
或是指定构造函数的Comparator
来对元素进行排序。不能保证同优先级的顺序性,放入的元素,必须实现Comparator接口
。- API:大部分API和
ArrayBlockingQueue
类似;只是多了一个take
方法;若,队列中无元素的时候,阻塞队列。等待元素插入。
- API:大部分API和
- DelayQueue:支持延时获取元素的无界阻塞队列。队列使用
priorityQueue
实现。队列中的元素必须实现Delay
接口,在创建元素的时候,指定多久才能从队列中获取当前元素,只有在延时期满时才能从队列中获取元素。- 应用场景:
- 缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询delayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。
- 定时任务调度:使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就执行。
- 应用场景:
- SynchronousQueue: 是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。默认情况下,采用非公平策略访问数据。
- LinkedTransferQueue:是一个由链表结构组成的无界阻塞TransferQueue队列;transfer之前,一定需要有消费的操作,不然,会导致transfer一直阻塞。必须等到被消费才能接着执行。
- LinkedBlockingDeque:是一个由链表组成的双向阻塞队列。可以从队列的两边插入或移除元素。