JUC--队列概述

1 概述

Java中的队列是一个FIFO的数据结构,适用于生产者消费者模式。Queue接口与List、Set同一级别,都是继承了Collection接口,LinkedList也实现了Deque接口。

当然java中的队列有阻塞和非阻塞队列,下面我们就来看一看Java中队列都有哪些实现。

2 类图

下面我们来看一下java中队列的家庭成员。

《JUC--队列概述》

3 详细说明

3.1 Queue

Queue接口继承于Collection接口,用于存储将要被使用的数据。也就是说Queue是一个队列,采用FIFO的方式,针对Queue接口,除了拥有Collection的方法之外,还拥有处理队列数据的独有方法。这些方法在处理失败情况的时候表现为两种行为,一种是直接抛出异常,一种返回false或者返回空。下面针对方法详细说明。

操作失败的处理抛出异常返回false或者null
添加addoffer
返回并移除(尾部的元素)removepoll
返回不移除(尾部的元素)elementpeek

这里我们需要注意的是Queue不建议插入null,因为在某些操作失败的情况下也会返回null。

3.2 BlockingQueue

BlockingQueue继承自Queue,处理包含Queue的功能之外,还支持阻塞等待。当获取数据的时候,如果队列中没有数据,将等待直到有数据或者超时。当存入数据的时候,如果没有空闲位置用于存放数据,将等待直到由空闲位置或者超时。下面我们具体来看这几种方式的方法。

 抛出异常返回特殊值阻塞超时等待
添加addofferputoffer(Object,long,TimeUnit)
返回并移除(尾部的元素)removepolltakepoll(long, TimeUnit)
返回不移除(尾部的元素)elementpeek  

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

等待一定的时间,如果数据没有被消费就直接返回

上面就是针对队列有关的抽象类和接口的详细说明,至于具体的队列类,我们将在后续的文章中分析。

 

    原文作者:JUC
    原文地址: https://blog.csdn.net/ONROAD0612/article/details/82858273
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞