1. 程式人生 > >java 阻塞佇列BlockingQueue

java 阻塞佇列BlockingQueue

java中阻塞BlockingQueue 介面實現類中用的較多的通常是ArrayBlockingQueue,LinkedBlockingQueue.它們都是執行緒安全的.ArrayBlockingQueue以陣列的形式儲存,LinkedBlockingQueue以node節點的方式進行儲存.

開發中如果佇列的插入操作比較頻繁建議使用LinkedBlockingQueue,因為每個node節點都有一個前後指標,插入新元素僅需要變更前後的指標引用即可, ArrayBlockingQueue插入新元素,則新元素之後的元素陣列下標位置都要發生變化,效能較差. 如果佇列的讀取操作比較頻繁建議使用ArrayBlockingQueue, ArrayBlockingQueue通過陣列下標直接能找到對應元素,LinkedBlockingQueue則需要遍歷node鏈來找到元素.

BlockingQueue 佇列常用的操作方法:

1.往佇列中新增元素: add(), put(), offer()

2.從佇列中取出或者刪除元素: remove() element()  peek()   pool()  take()

佇列新增新元素一般都是往隊尾新增元素, 

offer()方法往佇列新增元素如果佇列已滿直接返回false,佇列未滿則直接插入並返回true;

add()方法是對offer()方法的簡單封裝.如果佇列已滿,丟擲異常new IllegalStateException("Queue full");

put()方法往佇列裡插入元素,如果佇列已經滿,則會一直等待直到佇列為空插入新元素,或者執行緒被中斷丟擲異常.

佇列中取出或者刪除元素都是針對隊頭的元素

remove()方法直接刪除隊頭的元素:

peek()方法直接取出隊頭的元素,並不刪除.

element()方法對peek方法進行簡單封裝,如果隊頭元素存在則取出並不刪除,如果不存在丟擲異常NoSuchElementException()

pool()方法取出並刪除隊頭的元素,當佇列為空,返回null;

take()方法取出並刪除隊頭的元素,當佇列為空,則會一直等待直到佇列有新元素可以取出,或者執行緒被中斷丟擲異常

offer()方法一般跟pool()方法相對應, put()方法一般跟take()方法相對應.日常開發過程中offer()與pool()方法用的相對比較頻繁.