我對與Java BlockingQueue相同的數據結構感興趣,除了它必須能夠對隊列中的對象進行批處理。換句話說,我希望生產者能夠將對象放入隊列中,但讓消費者阻止take()
,直到隊列達到一定的大小(批量大小)。Java BlockingQueue與批處理?
然後,一旦隊列達到批量大小,生產者必須阻止put()
直到消費者已經消耗了隊列中的所有元素(在這種情況下,生產者將再次開始生產並且消費者阻止直到批次再次達到)。
是否存在類似的數據結構?或者我應該寫它(我不介意),我只是不想浪費我的時間,如果有東西在那裏。
UPDATE
也許澄清事情有點:
的情況永遠是如下。可以有多個生產者將項目添加到隊列中,但永遠不會有多個消費者從隊列中抽取項目。
現在,問題是這些設置有多個並行和串行設置。換句話說,生產者爲多個隊列生產物品,而消費者本身也可以是生產者。這可以更容易地被認爲是生產者,消費者生產者和最終消費者的有向圖。
生產者應該阻塞,直到隊列爲空(@Peter Lawrey)的原因是因爲它們中的每一個都將在一個線程中運行。如果讓它們在空間變得可用時簡單地生成,那麼最終會出現一種情況,即您有太多線程試圖一次處理太多事情。
也許這與執行服務耦合可以解決問題?
我希望生產者在消費者忙時阻止。 – 2012-02-27 14:49:03
有趣的是,大多數系統竭盡全力避免這種情況。 ;)第二個建議將做到這一點。如果你想阻止生產者,爲什麼你使用多線程?對於「製片人」來說,處理器/消費者以及你似乎並不希望他們同時運行是不是更簡單。 – 2012-02-27 14:50:55
請參閱我的更新。該設計要求生產者也是如此,以便執行線程的數量保持較低。此外,它解決了生產者和消費者之間的依賴性問題。 – 2012-02-27 16:17:06