生产者/消费者-生产者在不阻塞的情况下将数据添加到集合,消费者批量消费集合中的数据



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

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

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

你有什么建议吗?

谢谢!

最后我使用了LinkedBlockingQueue。

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

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

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

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

最新更新