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