java - Producer/Consumer——生产者无阻塞地向集合中添加数据,消费者批量消费集合中的数据

标签 java collections concurrency queue producer-consumer

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

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

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

你有什么建议吗?

谢谢!

最佳答案

最后我选择了 LinkedBlockingQueue。

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

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

关于java - Producer/Consumer——生产者无阻塞地向集合中添加数据,消费者批量消费集合中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22211142/

相关文章:

Select 语句的细微差别

java - 使用 ZK 配置 AOP 以拦截方法

java - 使用stream().sorted()比Collection.sort()有什么优势吗?

java - 2 个集合中的一个对象(引用)

c# - 遍历事件日志条目集合,IndexOutOfBoundsException

multithreading - 为什么这个变量定义意味着静态生命周期?

java - 列出 servlet 中的 ConcurrentModificationException

java - Android:如何使用 ThreadSafeClientConnectionManager 为 SSL 套接字设置超时以阻止读/写?

java - 为什么要创建 List<Object>

java - 从 Format 对象中检索格式字符串