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