提到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 c)
// 将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回 true,如果此队列已满,则抛出 IllegalStateException。
boolean add(E e)
// 自动移除此队列中的所有元素。
void clear()
// 如果此队列包含指定的元素,则返回 true。
boolean contains(Object o)
// 移除此队列中所有可用的元素,并将它们添加到给定 collection 中。
int drainTo(Collection c)
// 最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定 collection 中。
int drainTo(Collection c, int maxElements)
// 返回在此队列中的元素上按适当顺序进行迭代的迭代器。
Iterator 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[] 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的方法及不足点内容请搜索乐虎体育以前的文章或继续浏览下面的相关文章希望大家以后多多支持乐虎体育!

标签:

java ArrayBlockingQueue的方法及缺点分析的更多相关文章

  1. JVM虚拟机Class类文件研究分析

    本文对java编译后的Class文件进行研究,依次介绍了Class文件中魔数、JDK版本号、常量池、访问标志、类索引、父类索引与接口索引集合、字段表、方法表、属性表等,最后简单介绍了Class文件阅读流程。前言为了研究Class文件,先编写一个最简单的代码:package com.courage;p......

  2. java中日期格式化的大坑

    前言我们都知道在java中进行日期格式化使用simpledateformat。通过格式 yyyy-MM-dd 等来进行格式化,但是你知道其中微小的坑吗?yyyy 和 YYYY示例代码@Testpublic void testWeekBasedYear() {Calendar calendar = C......

  3. Java Lombok简介、使用、工作原理、优缺点

    简介官方介绍Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or ......

  4. java封装实例用法讲解

    我们可以选择把类的方法、属性装起来,便于日后的程序书写和使用,这种处理方法就是封装的思想。因为封装类之后,其他的外部类方法就不能在混入其中,对代码的安全性进行了提高。接下来我们就对java中封装的概念、目的进行介绍,然后在实例中为大家演示封装的方法。1.概念封装性是面向对象三大特征之一,是指一种将抽......

  5. 手把手教你搭建SSH框架(Eclipse版)

    原文来自公众号【C you again】,若需下载完整源码,请在公众号后台回复“ssh”。本期文章详细讲解了SSH(Spring+SpringMVC+Hibernate)框架的搭建过程,语言简洁、通俗易懂,适合初级程序员阅读。在开始教程之前,先来了解SSH框架的基本概念:在文章《手把手教你搭建SSM......

  6. Java异常处理场景中不同位置的返回值详细解析

    Java 异常处理中的返回值在不同位置不同场景下是有一些差别的,这里需要格外注意具体分以下两种场景:1 finally语句块没有return语句,即当代码执行到try或者catch语句块中的return语句时,相当于在本地保存了一份此时返回值的变量的值副本,然后按照try catch finally......

  7. Java中的clone方法实例详解

    Java中对象创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?1 使用new操作符创建一个对象2 使用clone方法复制......

  8. java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开。throws的作用是声明抛出,在名称上也跟throw有所不同。下面我们就throws对策概念、语法、实例带来讲解,帮助大家找到声明抛出异常的方法,具体方法如下。1.概念如果方法声明的是Exception类型......

  9. Java DriverManager.getConnection()获取数据库连接

    DriverManager.getConnection一共有四个重载方法,前三个由public修饰,用来获取不同类型的参数,这三个getConnection实际相当于一个入口,他们最终都会return第四个私有化的getConnection方法,最终向第四个私有化方法的传入参数都是url,java.......

  10. Java中的CPU占用高和内存占用高的问题排查

    下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下。1、Java CPU过高的问题排查举个例子,如下:package com.classloading;public class Test {sta......

随机推荐

  1. MySQL 权限控制细节分析

    今天周天,早上懒了一会儿,起的有点儿晚,中午没事儿干,重新看了看MySQL里面的权限控制模块,再次回头看,还是有很多收获的细节,这里记录一下,方便自己后续查看。 关于权限部分的内容,之前3月11号的文章中有写过一些,今天的内容,我们使用一个一个的细节知识点来撰写(本文中所使用的My......

  2. Python PyQt5中弹出子窗口解决子窗口一闪而过的问题

    方式一:槽函数中创建子窗口对象,赋值到普通变量在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到普通变量,并调用其 show 方法。from PyQt5.QtWidgets import *import sysclass Main(QMainWindow):def __init......

  3. 文件上传漏洞全面渗透姿势总结

    文件上传漏洞全面渗透姿势总结0x00 文件上传场景(本文档只做技术交流,切勿进行违法犯罪操作,请做一个好人,不给别人添麻烦)文件上传的场景真的随处可见,不加防范小心,容易造成漏洞,造成信息泄露,甚至更为严重的灾难。比如某博客网站评论编辑模块,右上角就有支持上传图片的功能,提交带有恶意字符串的图片后,......

  4. Java多线程总结(一)

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。一.线程的生命周期及五种基本状态关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括:Java线程具有五中基......

  5. c# WPF中自定义加载时实现带动画效果的Form和FormItem

    背景今天我们来谈一下我们自定义的一组WPF控件Form和FormItem,然后看一下如何自定义一组完整地组合WPF控件,在我们很多界面显示的时候我们需要同时显示文本、图片并且我们需要将这些按照特定的顺序整齐的排列在一起,这样的操作当然通过定义Grid和StackPanel然后组合在一起当然也是可以的......

  6. asp(vbscript)中自定义函数的默认参数实现代码

    现代语言的函数中都可以带有默认参数,在vbscript系统内建的函数可以带有可选值(如常用的 split()等等),然而我们自己定义的函数中无法具有此功能.下面提供一个方法实现可选参数的功能.functin foo(dtype, dsize, value) dim a......

  7. Python使用Protobuf&&如何赋值&&如何正反序列化

    此文主要是总结,python使用protobuf的过程,如何序列化和反序列化,对不同类型的字段如何进行赋值。前言使用protobuf主要是两个步骤,序列化和反序列化。关于Proto有哪些数据类型,然后如何编写,此处就不赘述了,百度一下有很多。此文主要是总结,python使用protobuf的过程,如......

  8. Vue使用Ref跨层级获取组件实例

    目录Vue使用Ref跨层级获取组件实例示例介绍文档目录结构安装vue-ref根组件自定义方法[使用provide和inject]分别说明各个页面结果Vue使用Ref跨层级获取组件实例示例介绍在开发过程中,我们难免会使用到跨层级的ref实例获取,大部分情况下,我们都可以通过组件自身的parent或者c......

  9. PHP中强制类型转换的示例详解

    前言学过静态语言开发的朋友对类型转换不会陌生,比如Java、C#、C++等。静态语言的好处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求。而PHP据说也会在PHP8中加入JIT实现编译功能,并且在7.4中就会引入变量声明时的类型指定。下面我们先看看目前PH......

  10. python 装饰器的基本使用

    知识点简单的装饰器带有参数的装饰器带有自定义参数的装饰器类装饰器装饰器嵌套@functools.wrap装饰器使用基础使用简单的装饰器def my_decorator(func):def wrapper():print('wrapper of decorator')func()return wrap......