https://www.cnblogs.com/xuxiuxiu/p/6830485.html
BlockingQueue接口
ArrayBlockingQueue:基於數組的阻塞隊列實現,在ArrayBlockingQueue內部,維護了一個定長數組,
以便緩存隊列中的數據對象,其內部沒實現讀寫分離,也就童味着生產和消費不能完全並行,
長度是需要定義的,可以指定先進先出成者先進後出,也叫有界隊列。在很多場合非常適合使用。
LinkedBlockingQueue:基於鏈表的風塞隊列,同ArrayBlockingQueue類似. 其內部也維持着一
個數據緩衝隊列(該隊列由一個鏈表構成) ,LinkedBlockingQueue之 所以能夠高效的處理併發數據,
是因爲其內部實現採用分高鎖(讀寫分高兩個鎖),從而實現生產者和消費者操作的完全並行運行。
他是一一個無界隊列。
SynchronousQueue-種沒有緩衝的隊列, 生產者產生的數據直接會被消費者獲取並消費.
PrioriyBlockingQueue;基於優先級的阻離隊列(優先級的判斷通過構造所數傳入的Compator對象來決定,
也就是說傳入隊列的對象必須實現Comparable接口),在實現PriorityBlockingQueue時,
內部控制線程同步的鎖採用的是公平鎖。他也是一一個無界的隊列。
DelayQueue;帶有延遲時間的Queue,其中的元素只有當其指定的延遲時間到了,
才能夠從隊列中獲取到該元素。DelayQueue中的 元素必須實現Delayed接口,
DelayQueue是一個沒有大小限制的隊列,應用場景很多,比如對緩存超時的數據進行移除、
任務超時處理、空閒連接的關閉等等。
1.1offer(anObject):表示如果可能的話,將anObject加到BlockingQueue裏,即如果BlockingQueue可以容納,
則返回true,否則返回false.(本方法不阻塞當前執行方法的線程)
1.2offer(E o, long timeout, TimeUnit unit),可以設定等待的時間,如果在指定的時間內,還不能往隊列中
加入BlockingQueue,則返回失敗。
1.3put(anObject):把anObject加到BlockingQueue裏,如果BlockQueue沒有空間,則調用此方法的線程被阻斷
直到BlockingQueue裏面有空間再繼續.
獲取數據:
1.4 poll(time):取走BlockingQueue裏排在首位的對象,若不能立即取出,則可以等time參數規定的時間,
取不到時返回null;
1.5 poll(long timeout, TimeUnit unit):從BlockingQueue取出一個隊首的對象,如果在指定時間內,
隊列一旦有數據可取,則立即返回隊列中的數據。否則知道時間超時還沒有數據可取,返回失敗。
1.6 take():取走BlockingQueue裏排在首位的對象,若BlockingQueue爲空,阻斷進入等待狀態直到
BlockingQueue有新的數據被加入;
drainTo():一次性從BlockingQueue獲取所有可用的數據對象(還可以指定獲取數據的個數),
通過該方法,可以提升獲取數據效率;不需要多次分批加鎖或釋放鎖。