生产者/消费者 – 生产者将数据添加到集合中而不会阻塞,消费者会批量使用集合中的数据

我有一个生产者/消费者用例,这有点不寻常。 我有一些真实世界的用例,我希望他们能够在没有阻塞的情况下将对象添加到集合中。 消费者(只有一个)应该阻止,直到集合中有一定数量的对象可用(例如500),然后批量消费它们。 虽然少于500,但它应该阻止并等待集合填充。 我不介意队列是否超过这个值(700,1000等)很短的时间。

我目前似乎没有找到解决这个确切问题的解决方案。 我正在考虑使用ConcurrentLinkedQueue并让消费者定期检查队列是否有足够的数据,但这似乎适得其反。

另一个想法是使用LinkedBlockingQueue。 生产者不会阻止(除非队列已满,这意味着它有Integer.MAX_VALUE值 – 这不是我的情况,所以这一切都很好)。 使用者将执行queue.take()并将元素添加到内部集合中。 当内部集合达到500个元素时,它将批量使用它们。

你有什么建议吗?

谢谢!

最后,我选择了LinkedBlockingQueue。

生产者将项目添加到队列中。

使用者将执行queue.poll()并将项目保存到内部集合中。 当内部集合达到500个元素时,它将批量使用它们。 我也可以设置一些超时。 例如,如果X秒已经过去,我将消耗该集合,即使它具有的项目少于所需的项目(例如220)。

您可以简单地引入一个中间队列和消费者/生产者,它将从生产者填充的队列中获取项目,将它们存储在列表中,一旦列表大小为500,将列表本身放入消费者读取的队列中。 消费者将阻止,直到下一个500项的列表可用。

当然,您也可以将此逻辑封装在生产者共享的对象中:生产者将其项目添加到“Batcher”对象中。 batcher对象将项添加到私有列表,一旦列表大小为500,batcher将列表添加到队列。 只需确保batcher的addItem()方法已同步。 这将避免额外的线程和队列。