我有一個情況,我有多個生產者和單個消費者。 由於性能方面的原因,我不希望消費者處於任何阻塞狀態,但由於可能有更多的生產者,他們應該在隊列滿時「阻塞」。生產者消費者阻止隊列
是否有任何隊列爲我提供這樣的行爲,或者如何根據需要修改ArrayBlockingQueue?
我有一個情況,我有多個生產者和單個消費者。 由於性能方面的原因,我不希望消費者處於任何阻塞狀態,但由於可能有更多的生產者,他們應該在隊列滿時「阻塞」。生產者消費者阻止隊列
是否有任何隊列爲我提供這樣的行爲,或者如何根據需要修改ArrayBlockingQueue?
任何BlockingQueue
實現有什麼問題?您的消費者可以撥打
peek()
poll()
這是非阻塞的,您的生產者可以撥打電話put(E e)
,如果隊列已滿,它會阻止。
UPDATE
如果使用的是一個令人難以置信的密集的任務隊列,然後LMAX's disruptor ring buffer很可能是最高效的隊列結構。
使用非阻塞ArrayBlockingQueue.poll
爲消費者和生產者
我可能對此無法正確理解,或者我表達了自己的不足,但看着ArrayBlockingQeueu的源代碼,poll仍在獲取一個鎖,這意味着如果還有其他鎖,它將排隊等候輪到它......不?我不希望消費者參與鎖定 - 只需從給定的索引中抓取並通知生產者即可。我已經用poll進行了這個實現,但是看起來消費者在某種程度上「餓死」,因爲生產者池(等於隊列長度)正在競爭並等待(持有我假設的鎖)。 – hpet
好吧,你說過你不想阻塞,並且不會阻止任何人投票。至於鎖定,恐怕你不能做無鎖的BlockingQueue,因爲它需要等待/以某種方式通知 –
阻擋
ArrayBlockingQueue.put
'ArrayBlockingQueue'不是終點,就可以延伸並覆蓋其功能。 –