ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。
线程安全是指,ArrayBlockingQueue内部通过“互斥锁”保护竞争资源,实现了多线程对竞争资源的互斥访问。而有界,则是指ArrayBlockingQueue对应的数组是有界限的。阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待,而且,之间是按FIFO(先进先出)原则对元素进行排序,元素都是从尾部插入到队列,从头部开始返回。
注意:ArrayBlockingQueue不同于ConcurrentLinkedQueue,之间是数组实现的,并且是有界限的;而ConcurrentLinkedQueue是链表实现的,是无界限的只
之间的数据结构,如下图所示:
,,,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学院整理