当前位置: 首页 > 编程笔记 >

java ArrayBlockingQueue的方法及缺点分析

张淳
2023-03-14
本文向大家介绍java ArrayBlockingQueue的方法及缺点分析,包括了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的方法及不足点内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍浅谈JavaScript事件绑定的常用方法及其优缺点分析,包括了浅谈JavaScript事件绑定的常用方法及其优缺点分析的使用技巧和注意事项,需要的朋友参考一下 传统方式   1.  传统绑定的优点 非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致 处理事件时,this关键字引用的是当前元素,这很有帮组 2. 传统绑定的缺点 传统方法只会在事件冒泡中运行,而非捕获和冒泡 一个

  • 主要内容:敏捷方法的优点,敏捷方法的缺点,瀑布模型的优点,瀑布模型的缺点,敏捷方法和瀑布模型的比较与传统的瀑布模型或其他模型相比,使用敏捷方法有很多优点。敏捷开发方法和测试实践为具有积极方面的众多组织创造了奇迹。它的积极方面不是隐藏的,它在组织中非常明显。 敏捷方法的优点 客户满意度是快速,持续开发和交付有用的软件。 客户,开发人员和产品负责人定期互动以强调而不是流程和工具。 产品开发快速且经常交付(数周而非数月)。 面对面交谈是最好的交流方式。 它不断关注技术卓越和良好的设计。 业务人员和开

  • 本文向大家介绍浅析Ajax的 原理及优缺点,包括了浅析Ajax的 原理及优缺点的使用技巧和注意事项,需要的朋友参考一下 1、ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth、google suggest以及gmail等对ajax技术的广泛应用,催生了ajax的流行。而这也让微软感到无比的尴尬,因为早在97年,微软便已经发明了ajax中的

  • 本文向大家介绍js跨域问题浅析及解决方法优缺点对比,包括了js跨域问题浅析及解决方法优缺点对比的使用技巧和注意事项,需要的朋友参考一下 什么是跨域? 概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。 对于端口和协议的不同,只能通过后台来解决。 跨域资源共享(CORS) CROS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览

  • 本文向大家介绍清除浮动的方式有哪些及优缺点?相关面试题,主要包含被问及清除浮动的方式有哪些及优缺点?时的应答技巧和注意事项,需要的朋友参考一下 这个问题刚好有思考整理过,今天刚好复习一下。 原文链接:https://xiangshuo.blog.csdn.net/article/details/52749993 回答前的唠叨: 在现在的实际工作当中我已经很少用浮动来布局了,真的很少,刚开始学习的时

  • 本文向大家介绍Java中遍历Map的多种方法示例及优缺点总结,包括了Java中遍历Map的多种方法示例及优缺点总结的使用技巧和注意事项,需要的朋友参考一下 前言 关于java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map keySet values 如果只需要map的