數(shù)組實(shí)現(xiàn)有界阻塞隊(duì)列。FIFO排序添加届腐。大小確認(rèn)不變(構(gòu)造函數(shù)來決定)铁坎。默認(rèn)不公平,構(gòu)造時(shí)可選擇(fair = true)犁苏。公平性降低吞吐量硬萍,減少可變性、“不平衡性”围详。
繼承AbstractQueue(對queue操作骨干實(shí)現(xiàn)朴乖,繼承java.util.Queue),實(shí)現(xiàn)BlockingQueue阻塞隊(duì)列核心接口助赞,提供多線程出买羞、入列操作
可重入鎖ReentrantLock + Condition完成并發(fā)
items,定長數(shù)組嫉拐,維護(hù)ArrayBlockingQueue元素
takeIndex哩都,int魁兼,為ArrayBlockingQueue對首位置
putIndex婉徘,int,ArrayBlockingQueue對尾位置
count咐汞,元素個(gè)數(shù)
lock盖呼,鎖,出入列公用鎖
notEmpty化撕,出列條件
notFull几晤,入列條件
入隊(duì)
ArrayBlockingQueue提供了諸多方法,可以將元素加入隊(duì)列尾部植阴。
add(E e) :插到尾部(如果立即可行且不會超過該隊(duì)列的容量)蟹瘾,成功返回 true圾浅,滿拋 IllegalStateException
offer(E e) :同上,滿返回 false憾朴;? ?offer(E e, long timeout, TimeUnit unit) :滿狸捕,等待時(shí)間前等可用空間;? ? put(E e) :滿等待
是否null众雷,獲取lock鎖成功灸拍,不滿調(diào)用enqueue(E e)入列的核心方法,隊(duì)尾插入
putIndex(對尾)添加砾省,最后用notEmpty的signal()通知阻塞在出列的線程(隊(duì)列空鸡岗,進(jìn)出列阻塞)
出隊(duì)
poll() : 獲取并移除隊(duì)列頭,隊(duì)列空返回 null
poll(long timeout, TimeUnit unit) :同上编兄,等待時(shí)間前等待可用元素
take() :同上轩性,元素可用前一直等待
remove(Object o)?:移除指定元素
隊(duì)列空返回null,否則調(diào)用dequeue()獲取列頭元素:
從列頭(takeIndex )取出元素狠鸳,迭代器itrs不null則?take()炮姨。最后調(diào)用notFull.signal()喚醒入列線程。
與poll()區(qū)別count == 0 處理碰煌,poll()返回null舒岸,take()notEmpty等入列喚醒