1. 程式人生 > >併發程式設計(四)------併發quene

併發程式設計(四)------併發quene

在併發佇列上JDK提供了兩套實現,一個是以ConcurrentLinkedQueue為代表的高效能佇列,一個是以BlockingQueue介面為代表的阻塞佇列,無論哪種都繼承自Queue介面!

ConcurrentLinkedQueue:

  是一個適用於高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態下的高效能,通常ConcurrentLinkedQueue效能好於BlockingQueue。它是一個基於連結節點的無界執行緒安全佇列。

  該佇列的元素遵循先進先出的原則,頭是最先加入的,尾是最近加入的,該佇列不允許null元素。

ConcurrentLinkedQueue重要方法:
add() 和 offer() 都是加入元素的方法 (在ConcurrentLinkedQueue中,這倆個方法沒有任何區別)
poll() 和 peek() 都是取頭元素節點,區別在於前者會刪除元素,後者不會。

 


BlockingQueue:

BlockingQueue介面的重要方法

offer(anObject): 表示如果可能的話, 將anObject加到BlockingQueue裡,即如果BlockingQueue可以容納, 則返回true, 否則返回false.(本方法不阻塞當前執行方法的執行緒)

offer(E o, long timeout, TimeUnit unit), 可以設定等待的時間,如果在指定的時間內,還不能往佇列中加入BlockingQueue,則返回失敗。

put(anObject): 把anObject加到BlockingQueue裡, 如果BlockQueue沒有空間, 則呼叫此方法的執行緒被阻斷直到BlockingQueue裡面有空間再繼續.

poll(long timeout, TimeUnit unit):從BlockingQueue取出一個隊首的物件,如果在指定時間內,佇列一旦有資料可取,則立即返回佇列中的資料。否則知道時間超時還沒有資料可取,返回失敗。

take(): 取走BlockingQueue裡排在首位的物件,若BlockingQueue為空,阻斷進入等待狀態直到BlockingQueue有新的資料被加入;

drainTo(): 一次性從BlockingQueue獲取所有可用的資料物件(還可以指定獲取資料的個數),通過該方法,可以提升獲取資料效率;不需要多次分批加鎖或釋放鎖。