了解 BlockingQueue:
BlockingQueue 位于 java.util.concurrent 中鳍贾,定義為 public interface BlockingQueue<E> extends Queue<E>杈湾。
在多線程領(lǐng)域:所謂阻塞挂疆,在某些情況下會(huì)掛起線程(即阻塞),一旦條件滿足,被掛起的線程又會(huì)自動(dòng)被喚醒。
理想情況下,如果生產(chǎn)者產(chǎn)出數(shù)據(jù)的速度大于消費(fèi)者消費(fèi)的速度又跛,并且當(dāng)生產(chǎn)出來(lái)的數(shù)據(jù)累積到一定程度的時(shí)候,那么生產(chǎn)者必須暫停等待一下(阻塞生產(chǎn)者線程)若治,以便等待消費(fèi)者線程把累積的數(shù)據(jù)處理完畢慨蓝。
BlockingQueue 的核心方法:
1.放入數(shù)據(jù)
offer(anObject):表示如果可能的話,將 an Object 加到 BlockingQueue 里,即如果 BlockingQueue 可以容納,則返回 true,否則返回 false.(本方法不阻塞當(dāng)前執(zhí)行方法的線程)
offer(E o, long timeout, TimeUnit unit):可以設(shè)定等待的時(shí)間,如果在指定的時(shí)間內(nèi)直砂,還不能往隊(duì)列中加入 BlockingQueue 菌仁,則返回失敗。
put(an Object):把 an Object 加到 BlockingQueue 里,如果 BlockingQueue 沒(méi)有空間,則調(diào)用此方法的線程被阻斷直到 BlockingQueue 里面有空間再繼續(xù).
2. 獲取數(shù)據(jù):
poll(time):取走 BlockingQueue 里排在首位的對(duì)象,若不能立即取出,則可以等 time 參數(shù)規(guī)定的時(shí)間,取不到時(shí)返回null;
poll(long timeout, TimeUnit unit):從 BlockingQueue 取出一個(gè)隊(duì)首的對(duì)象静暂,如果在指定時(shí)間內(nèi)济丘,隊(duì)列一旦有數(shù)據(jù)可取,則立即返回隊(duì)列中的數(shù)據(jù)洽蛀。否則知道時(shí)間超時(shí)還沒(méi)有數(shù)據(jù)可取摹迷,返回失敗。
take():取走 BlockingQueue 里排在首位的對(duì)象,若BlockingQueue為空,阻塞進(jìn)入等待狀態(tài)直到 BlockingQueue 有新的數(shù)據(jù)被加入;
drainTo():一次性從BlockingQueue獲取所有可用的數(shù)據(jù)對(duì)象(還可以指定獲取數(shù)據(jù)的個(gè)數(shù))郊供, 通過(guò)該方法峡碉,可以提升獲取數(shù)據(jù)效率;不需要多次分批加鎖或釋放鎖驮审。
常見(jiàn) BlockingQueue
- ArrayBlockingQueue (基于數(shù)組的阻塞隊(duì)列,a fixed-sized array.Once created, the capacity cannot be changed.)
- LinkedBlockingQueue
- DelayQueue (沒(méi)有大小限制)
DelayQueue 中的元素只有當(dāng)其指定的延遲時(shí)間到了鲫寄,才能夠從隊(duì)列中獲取到該元素.DelayQueue 是一個(gè)沒(méi)有大小限制的隊(duì)列,
因此往隊(duì)列中插入數(shù)據(jù)的操作(生產(chǎn)者)永遠(yuǎn)不會(huì)被阻塞疯淫,而只有獲取數(shù)據(jù)的操作(消費(fèi)者)才會(huì)被阻塞地来。 - PriorityBlockingQueue 基于優(yōu)先級(jí)的阻塞隊(duì)列
- SynchronousQueue