2013-06-26 111 views
1

我有一個情況,我有多個生產者和單個消費者。 由於性能方面的原因,我不希望消費者處於任何阻塞狀態,但由於可能有更多的生產者,他們應該在隊列滿時「阻塞」。生產者消費者阻止隊列

是否有任何隊列爲我提供這樣的行爲,或者如何根據需要修改ArrayBlockingQueue?

+0

阻擋ArrayBlockingQueue.put'ArrayBlockingQueue'不是終點,就可以延伸並覆蓋其功能。 –

回答

0

任何BlockingQueue實現有什麼問題?您的消費者可以撥打 peek() poll()這是非阻塞的,您的生產者可以撥打電話put(E e),如果隊列已滿,它會阻止。

UPDATE

如果使用的是一個令人難以置信的密集的任務隊列,然後LMAX's disruptor ring buffer很可能是最高效的隊列結構。

+0

我需要修改此鎖定的工作方式。我可能無法正確理解這個概念。如果生產者獲得了鎖,並且它進入「等待」狀態......那麼消費者想要獲得一些元素,並且還要在隊列上執行「鎖定」 - 發生了什麼?不生產者鎖定? – hpet

+0

在調用poll()期間,消費者線程可能會將上下文切換出來,同時持有該鎖,阻止其他消費者,但這很可能是短暫的。除非你有*顯着*(每秒成千上萬的隊列訪問次序),否則我不會期望它會引起你的問題。如果你*正在做一些密集的事情,那麼看看LMAX的破壞者吧:http://lmax-exchange.github.io/disruptor/ – SimonC

2

使用非阻塞ArrayBlockingQueue.poll爲消費者和生產者

+0

我可能對此無法正確理解,或者我表達了自己的不足,但看着ArrayBlockingQeueu的源代碼,poll仍在獲取一個鎖,這意味着如果還有其他鎖,它將排隊等候輪到它......不?我不希望消費者參與鎖定 - 只需從給定的索引中抓取並通知生產者即可。我已經用poll進行了這個實現,但是看起來消費者在某種程度上「餓死」,因爲生產者池(等於隊列長度)正在競爭並等待(持有我假設的鎖)。 – hpet

+0

好吧,你說過你不想阻塞,並且不會阻止任何人投票。至於鎖定,恐怕你不能做無鎖的BlockingQueue,因爲它需要等待/以某種方式通知 –