2017年12月3日 星期日

關於Java queue類說明


Java5中的queue類是隊伍數據結構管理類,
在它裡面的元素可以按照添加他們的相同順序被移除。
使用方法
offer 添加一個元素並返回 如果隊伍已滿,則返回false
poll 移除並返回隊伍頭部的元素 如果隊伍為空,則返回null
peek 返回隊伍頭部元素 如果隊伍為空,則返回null
put 添加一個元素 如果隊伍滿,則阻塞
take 移除並返回隊伍頭部的元素 如果隊伍為空,則阻塞
element 返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException
add 增加一個元素 如果隊伍已滿,則拋出一個IegaISalbEePeplian
remove 移除並返回隊伍頭部的元素 如果隊伍為空,則拋出一個NoSuchElementException



方法\處理方法 拋出異常 返回特殊值 一直阻塞 超時退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
檢查方法 element() peek() 不可用 不可用

但poll和peek方法出錯會返回null,因此向隊伍插入null是不合法的行為。

還有帶超時的 offer和poll方法重載,例如下面的呼叫

boolean result=q.offer(value,100,TimeUnit.MILLISECONDS)

嘗試在100毫秒內向隊伍尾部插入一個元素,如果成功返回true,但當超時進入時會返回false,同樣地,呼叫

Object head=q.pll(100,TimeUnit.MILLSECONDS)

如果在100毫秒內成功地移除了隊伍頭元素,則立即返回頭部元素,否則到達超時,返回null。

阻塞的操作有put和take,put方法是隊伍滿時阻塞,take方法是隊伍空時阻塞。

(阻塞的意思就是此條線程會處於等待卡死狀態,解鎖的條件是隊列中有另一條線程存入或取出數據了,就會解鎖,說白了就是滿了不能再存,空了不能取,都得等著,就相當於隊列是倉庫,倉庫沒有貨了就生產,倉庫有貨就能消費,鎖條件是notFull和notEmpty)

Queue接口和List、Set同一級別,都是繼承Collection 接口,LinkedList實現Queue介面,Queue介面窄化了對LinkedList的方法訪問權限(即是方法中的參數類型是Queue時,就完全只能訪問Queue接口所定義的方法了,而不能直接訪問LinkedList的非Queue方法

JDK7提供了7个阻塞队列。分别是
  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
參考網站,如有不妥,請告知,立即刪除
http://www.infoq.com/cn/articles/java-blocking-queue
https://zhidao.baidu.com/question/541161936.html
http://www.itread01.com/content/1501578122.html