java ArrayBlockingQueue的方法及缺点分析

 更新时间:2021年01月11日 16:16:21   作者:小妮浅浅  
在本篇内容里小编给大家整理的是一篇关于java ArrayBlockingQueue的方法及缺点分析,对此有兴趣的朋友们可以跟着学习下。

提到ArrayBlockingQueue的方法,想必大家都不陌生,我们在入队和出队的时候,接触了不少这方面的函数。当然ArrayBlockingQueue中的方法也不止于此,今天我们就全部为大家罗列出来,也算是做一个学习方向上的指引。然后就其中的peek方法带来实例介绍,并说明ArrayBlockingQueue使用的不足之处。

1.ArrayBlockingQueue函数列表

// 创建一个带有给定的(固定)容量和默认访问策略的 ArrayBlockingQueue。
ArrayBlockingQueue(int capacity)
// 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue。
ArrayBlockingQueue(int capacity, boolean fair)
// 创建一个具有给定的(固定)容量和指定访问策略的 ArrayBlockingQueue,它最初包含给定 collection 的元素,并以 collection 迭代器的遍历顺序添加元素。
ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
// 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则抛出 IllegalStateException。
boolean add(E e)
// 自动移除此队列中的所有元素。
void clear()
// 如果此队列包含指定的元素,则返回 true。
boolean contains(Object o)
// 移除此队列中所有可用的元素,并将它们添加到给定 collection 中。
int drainTo(Collection<? super E> c)
// 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。
int drainTo(Collection<? super E> c, int maxElements)
// 返回在此队列中的元素上按适当顺序进行迭代的迭代器。
Iterator<E> iterator()
// 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则返回 false。
boolean offer(E e)
// 将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。
boolean offer(E e, long timeout, TimeUnit unit)
// 获取但不移除此队列的头;如果此队列为空,则返回 null。
E peek()
// 获取并移除此队列的头,如果此队列为空,则返回 null。
E poll()
// 获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。
E poll(long timeout, TimeUnit unit)
// 将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。
void put(E e)
// 返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。
int remainingCapacity()
// 从此队列中移除指定元素的单个实例(如果存在)。
boolean remove(Object o)
// 返回此队列中元素的数量。
int size()
// 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。
E take()
// 返回一个按适当顺序包含此队列中所有元素的数组。
Object[] toArray()
// 返回一个按适当顺序包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
<T> T[] toArray(T[] a)
// 返回此 collection 的字符串表示形式。
String toString()

2.peek方法实例

读取队列中队首的元素,不会删除该元素。

//获取元素,元素不出队
public E peek() {
    //上锁
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
      //调用itemAt方法获取元素
      return itemAt(takeIndex); // null when queue is empty
    } finally {
      //释放锁资源
      lock.unlock();
    }
  }

3.ArrayBlockingQueue缺点

(1)队列长度固定且必须在初始化时指定,所以使用之前一定要慎重考虑好容量;

(2)如果消费速度跟不上入队速度,则会导致提供者线程一直阻塞,且越阻塞越多,非常危险;

(3)只使用了一个锁来控制入队出队,效率较低

ArrayBlockingQueue用法扩展:

1、ArrayBlockingQueue(int)

接收一个整型的参数,这个整型参数指的是队列的长度,其定义如下,

public ArrayBlockingQueue(int capacity) {
    this(capacity, false);
  }

可以看到这个方法调用的是ArrayBlockingQueue(int,boolean)方法,那么看下这个方法,

2、ArrayBlockingQueue(int,boolean)

接收两个参数,一个整型,一个boolean类型,前边已经知道整型参数是队列的长度,那么boolean类型参数代表什么意思那,其定义如下,

public ArrayBlockingQueue(int capacity, boolean fair) {
    if (capacity <= 0)
      throw new IllegalArgumentException();
    this.items = new Object[capacity];
    lock = new ReentrantLock(fair);
    notEmpty = lock.newCondition();
    notFull = lock.newCondition();
  }

可以看到在这个构造方法中进行了相关逻辑实现,对items进行了数组初始化,boolean类型的参数是作为可重入锁的参数进行初始化,规定可重入锁是公平还是不公平,默认为false,另外初始化了notEmpty、notFull两个信号量。

到此这篇关于java ArrayBlockingQueue的方法及缺点分析的文章就介绍到这了,更多相关java ArrayBlockingQueue的方法及不足点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文探索Apache HttpClient如何设定超时时间

    一文探索Apache HttpClient如何设定超时时间

    Apache HttpClient是一个流行的Java库,用于发送HTTP请求,这篇文章主要为大家介绍了Apache HttpClient如何设定超时时间,感兴趣的小伙伴可以学习一下
    2023-10-10
  • Java设计模式之初识行为型模式

    Java设计模式之初识行为型模式

    今天带大家学习Java设计模式的相关知识点,文中对Java行为型模式做了非常详细的介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Java中的ReadWriteLock读写锁详解

    Java中的ReadWriteLock读写锁详解

    这篇文章主要介绍了Java中的ReadWriteLock读写锁详解,ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程,需要的朋友可以参考下
    2023-12-12
  • Java小程序计算圆周率代码

    Java小程序计算圆周率代码

    这篇文章主要介绍了Java小程序计算圆周率代码,有两种实现方法,喜欢的朋友可以参考下。
    2017-09-09
  • SpringBoot @Transactional事务不生效排查方式

    SpringBoot @Transactional事务不生效排查方式

    这篇文章主要介绍了SpringBoot @Transactional事务不生效排查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Springboot+AOP实现返回数据提示语国际化的示例代码

    Springboot+AOP实现返回数据提示语国际化的示例代码

    这篇文章主要介绍了Springboot+AOP实现返回数据提示语国际化的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    这篇文章主要介绍了SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 如何在Spring Boot项目中使用Spring AI

    如何在Spring Boot项目中使用Spring AI

    Spring AI是Spring框架中用于集成和使用人工智能和机器学习功能的组件,它提供了一种简化的方式来与AI模型进行交互,这篇文章主要介绍了Spring Boot 在项目中使用Spring AI,需要的朋友可以参考下
    2024-05-05
  • springboot服务正常启动之后,访问服务url无响应问题及解决

    springboot服务正常启动之后,访问服务url无响应问题及解决

    这篇文章主要介绍了springboot服务正常启动之后,访问服务url无响应问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java中的Semaphore信号量简析

    Java中的Semaphore信号量简析

    这篇文章主要介绍了Java中的Semaphore信号量简析,Semaphore:信号量,用来限制能同时访问共享资源的线程上限,使用Semaphore实现简单连接池,对比享元模式下的实现(用wait和notify),性能和可读性要更好,需要的朋友可以参考下
    2023-12-12

最新评论