1 概述
Java中的队列是一个FIFO的数据结构,适用于生产者消费者模式。Queue接口与List、Set同一级别,都是继承了Collection接口,LinkedList也实现了Deque接口。
当然java中的队列有阻塞和非阻塞队列,下面我们就来看一看Java中队列都有哪些实现。
2 类图
下面我们来看一下java中队列的家庭成员。
3 详细说明
3.1 Queue
Queue接口继承于Collection接口,用于存储将要被使用的数据。也就是说Queue是一个队列,采用FIFO的方式,针对Queue接口,除了拥有Collection的方法之外,还拥有处理队列数据的独有方法。这些方法在处理失败情况的时候表现为两种行为,一种是直接抛出异常,一种返回false或者返回空。下面针对方法详细说明。
操作失败的处理 | 抛出异常 | 返回false或者null |
添加 | add | offer |
返回并移除(尾部的元素) | remove | poll |
返回不移除(尾部的元素) | element | peek |
这里我们需要注意的是Queue不建议插入null,因为在某些操作失败的情况下也会返回null。
3.2 BlockingQueue
BlockingQueue继承自Queue,处理包含Queue的功能之外,还支持阻塞等待。当获取数据的时候,如果队列中没有数据,将等待直到有数据或者超时。当存入数据的时候,如果没有空闲位置用于存放数据,将等待直到由空闲位置或者超时。下面我们具体来看这几种方式的方法。
抛出异常 | 返回特殊值 | 阻塞 | 超时等待 | |
添加 | add | offer | put | offer(Object,long,TimeUnit) |
返回并移除(尾部的元素) | remove | poll | take | poll(long, TimeUnit) |
返回不移除(尾部的元素) | element | peek |
3.3 AbstractQueue
抽象队列类,这个类实现了队列类的基本方法add,remove,element,并且这些类内部的实现分别依赖于offer,poll和peek,所有继承于AbstractQueue的类得实现offer,poll和peek这三个函数。
3.4 TransferQueue
这个接口继承自BlockingQueue接口,是一个阻塞队列,使用这个队列,生产者可以等待消费者消费了自己生产的数据然后再返回。具体提供了如下三个数据传输的方法:
(1)boolean tryTransfer(E e)
传输数据到队列中,如果有消费者马上使用了传递的数据就返回true,否则返回false。
(2)void transfer(E e) throws InterruptedException
传输数据到队列中,等待直到自己生产的数据被消费者消费。
(3) boolean tryTransfer(E e, long timeout, TimeUnit unit) throws InterruptedException
等待一定的时间,如果数据没有被消费就直接返回
上面就是针对队列有关的抽象类和接口的详细说明,至于具体的队列类,我们将在后续的文章中分析。