Java并发集合之ArrayBlockingQueue_动力节点Java学院整理

  

  

ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。

  

线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。而有界,则是指ArrayBlockingQueue对应的数组是有界限的。阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待,而且,之间是按FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列,从头部开始返回。

  

注意:ArrayBlockingQueue不同于ConcurrentLinkedQueue,之间是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的只
  

  

  

之间的数据结构,如下图所示:

  

癑ava并发集合之ArrayBlockingQueue_动力节点Java学院整理"

  


  

  

,,,1. ArrayBlockingQueue继承于AbstractQueue,并且它实现了BlockingQueue接口。

  

,,2. ArrayBlockingQueue内部是通过对象[]数组保存数据的,也就是说ArrayBlockingQueue本质上是通过数组实现的.ArrayBlockingQueue的大小,即数组的容量是创建ArrayBlockingQueue时指定的只,,
  

  

3。ArrayBlockingQueue与ReentrantLock是组合关系,ArrayBlockingQueue中包含一个ReentrantLock对象(锁)。

  

ReentrantLock是可重入的互斥锁,之间就是根据该互斥锁实现“多线程对竞争资源的互斥访问”。而且,ReentrantLock分为公平锁和非公平锁,关于具体使用公平锁还是非公平锁,在创建ArrayBlockingQueue时可以指定,而且,ArrayBlockingQueue默认会使用非公平锁只,,
  

  

4。ArrayBlockingQueue与条件是组合关系,ArrayBlockingQueue中包含两个条件对象(notEmpty和notFull)。而且,条件又依赖于ArrayBlockingQueue而存在,通过条件可以实现对之间的更精确的访问——(01)若某线程(线程)要取数据时,数组正好为空,则该线程会执行notEmpty.await()进行等待;当其它某个线程(线程B)向数组中插入了数据之后,会调用notEmpty.signal()唤醒”notEmpty上的等待线程”。此时,线程一个会被唤醒从而得以继续运行。(02)若某线程(线程H)要插入数据时,数组已满,则该线程会它执行notFull.await()进行等待;当其它某个线程(线程I)取出数据之后,会调用notFull.signal()唤醒”notFull上的等待线程”。此时,线程H就会被唤醒从而得以继续运行只,,
  

  

     //创建一个带有给定的(固定)容量和默认访问策略的之间。   ArrayBlockingQueue (int容量)//创建一个具有给定的(固定)容量和指定访问策略的之间。   ArrayBlockingQueue (int能力,布尔公平)//创建一个具有给定的(固定)容量和指定访问策略的之间,它最初包含给定集合的元素,并以收集迭代器的遍历顺序添加元素。   ArrayBlockingQueue (int能力,布尔公平,Collection<& # 63;E>延伸;c)//将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回真,如果此队列已满,则抛出IllegalStateException。   布尔加(E E)//自动移除此队列中的所有元素。   空白clear ()//如果此队列包含指定的元素,则返回现实。   布尔(包含对象o)//移除此队列中所有可用的元素,并将它们添加到给定集合中。   int drainTo (Collection<& # 63;超级E>c)//最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定集合中。   int drainTo (Collection<& # 63;超级E>c, int maxElements)//返回在此队列中的元素上按适当顺序进行迭代的迭代器。   Iterator迭代器()//将指定的元素插入到此队列的尾部(如果立即可行且不会超过该队列的容量),在成功时返回真,如果此队列已满,则返回错误的。   布尔提供(E E)//将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。   布尔提供(E E,长时间超时,TimeUnit单元)//获取但不移除此队列的头,如果此队列为空,则返回零。   E peek ()//获取并移除此队列的头,如果此队列为空,则返回零。   E poll ()//获取并移除此队列的头部,在指定的等待时间前等待可用的元素(如果有必要)。   E调查(长超时,TimeUnit unit)//将指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。   空把(E E)//返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。   int remainingCapacity ()//从此队列中移除指定元素的单个实例(如果存在)。   逻辑删除对象(o)//返回此队列中元素的数量。   int大小()//获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。   E采取()//返回一个按适当顺序包含此队列中所有元素的数组。   对象[]toArray ()//返回一个按适当顺序包含此队列中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。   & lt; T>T [] toArray (T [])//返回此集合的字符串表示形式。   字符串toString ()

Java并发集合之ArrayBlockingQueue_动力节点Java学院整理