BlockingQueue,用JDK文檔中的原話,是用來解決類似生產(chǎn)者消費者問題的。
當一個Queue為空,則所有消費者被block;當一個Queue中元素已滿,則所有生產(chǎn)者被block。生產(chǎn)者生產(chǎn)了之后,要notify所有消費者,queue中元素已不為空。相對應(yīng)的,消費者消費了元素之后,要notify所有生產(chǎn)者,queue元素已不滿。
在Java中,BlockingQueue是一個繼承了Queue的接口,其實現(xiàn)有:ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue以及SynchronousQueue.
ArrayBlockingQueue:
底層數(shù)據(jù)結(jié)構(gòu)是一個Object數(shù)組,同時有一個takeIndex,一個putIndex來表示獲取操作和放操作的指針,一個count變量來記錄Queue里的元素

對于并發(fā)控制,用一個ReentrantLock作為鎖,兩個Condition作為提示隊列滿或空的信號量

put函數(shù)作為類似生產(chǎn)者的函數(shù)。具體的實現(xiàn)就是經(jīng)典的生產(chǎn)者實現(xiàn)了。當隊列為滿的時候,信號量一直等待。當插入成功后,notify所有的正在等待的消費者。具體代碼如下:


take函數(shù)作為類似消費者的函數(shù)。同理也是經(jīng)典的生產(chǎn)者實現(xiàn)。
當隊列為空的時候,信號量一直等待。當消費成功后,notify所有的正在等待的生產(chǎn)者。具體代碼如下:


LinkedBlockingQueue
LinkedBlockingQueue,顧名思義,是底層用Linkedlist來實現(xiàn)的BlockingQueue