您当前的位置: 首页 >  Java

_waylau

暂无认证

  • 2浏览

    0关注

    275博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java数据结构及算法实战】系列009:Java队列03——数组实现的阻塞队列ArrayBlockingQueue

_waylau 发布时间:2022-04-27 21:59:13 ,浏览量:2

顾名思义,ArrayBlockingQueue是基于数组实现的有界阻塞队列。该队列对元素进行FIFO排序。队列的首元素是在该队列中驻留时间最长的元素。队列的尾部是在该队列中停留时间最短的元素。新的元素被插入到队列的尾部,队列检索操作获取队列头部的元素。

 

ArrayBlockingQueue是一个经典的“有界缓冲区(bounded buffer)”,其中内部包含了一个固定大小的数组,用于承载包含生产者插入的和消费者提取的元素。ArrayBlockingQueue的容量一旦创建,不可更改。试图将一个元素放入一个满队列将导致操作阻塞;试图从空队列中取出一个元素也同样会阻塞。

 

ArrayBlockingQueue支持排序的可选公平策略,用于等待生产者和消费者线程。默认情况下,不保证此顺序。然而,一个由公平性设置为true构造的队列允许线程以FIFO顺序访问。公平性一般会降低吞吐量,但可以减少可变性,避免线程饿死。

 

ArrayBlockingQueue类及其迭代器实现了Collection和Iterator接口的所有可选方法。ArrayBlockingQueue是Java Collections Framework的一个成员。

 

 

1.   ArrayBlockingQueue的声明

ArrayBlockingQueue的接口和继承关系如下

 

public class ArrayBlockingQueue extends AbstractQueue

        implements BlockingQueue, java.io.Serializable {

 

   …

}

 

 

完整的接口继承关系如下图所示。

 

 

 

 

 

从上述代码可以看出,ArrayBlockingQueue既实现了BlockingQueue和java.io.Serializable接口,又继承了java.util.AbstractQueue。其中,AbstractQueue是Queue接口的抽象类,核心代码如下。

 

 

package java.util;

 

public abstract class AbstractQueue

    extends AbstractCollection

    implements Queue {

 

    protected AbstractQueue() {

    }

 

    public boolean add(E e) {

        if (offer(e))

            return true;

        else

            throw new IllegalStateException("Queue full");

    }

 

    public E remove() {

        E x = poll();

        if (x != null)

            return x;

        else

            throw new NoSuchElementException();

    }

 

    public E element() {

        E x = peek();

        if (x != null)

            return x;

        else

            throw new NoSuchElementException();

    }

 

    public void clear() {

        while (poll() != null)

            ;

    }

 

    public boolean addAll(Collection

关注
打赏
1651845987
查看更多评论
立即登录/注册

微信扫码登录

0.7338s