Меня интересует структура данных, идентичная Java BlockingQueue, за исключением того, что она должна иметь возможность группировать объекты в очереди. Другими словами, я хотел бы, чтобы производитель мог помещать объекты в очередь, но чтобы потребительский блок был на take ()
, пока очередь не достигнет определенного размера (размера пакета).
Затем, когда очередь достигает размера пакета, производитель должен заблокировать put ()
, пока потребитель не израсходует все элементы в очереди (в этом случае производитель снова начнет производство и потребительский блок до тех пор, пока партия не будет достигнута снова).
Существует ли подобная структура данных? Или я должен написать это (что я не против), я просто не хочу тратить свое время, если что-то там есть.
ОБНОВЛЕНИЕ
Может быть, чтобы немного прояснить ситуацию:
Ситуация всегда будет такой. Может быть несколько производителей, добавляющих элементы в очередь, но никогда не будет более одного потребителя, берущего элементы из очереди.
Проблема в том, что существует несколько таких установок параллельно и последовательно. Другими словами, производители производят товары для нескольких очередей, в то время как потребители сами по себе также могут быть производителями. Его легче представить как направленный граф производителей, потребителей-производителей и, наконец, потребителей.
Причина, по которой производители должны блокироваться до тех пор, пока очереди не опустеют (@Peter Lawrey), заключается в том, что каждая из них будет выполняться в потоке. Если вы оставите их просто производить по мере того, как станет доступным пространство, вы получите ситуацию, когда у вас слишком много потоков, пытающихся обработать слишком много вещей одновременно.
Может быть, связав это со службой выполнения, можно решить проблему?