java - 为生产者消费者问题的变体选择数据结构

标签 java data-structures producer-consumer

现在,我有一个队列,有多个生产者和一个消费者。

消费者线程运行缓慢。另外,consumer通过peek操作从queue中获取元素,在消费操作完成之前,不能将元素从queue中移除。这是因为作为辅助操作的生产者线程还会对在该时间点未完全处理的所有元素进行快照。

现在,我想更改我的代码以支持多个消费者。所以,假设我有三个线程,一个线程将获取第一个元素,可以通过 peek 操作读取它。 第二个消费者线程可以获取第二个元素,但我无法检索它,因为队列不支持检索第二个元素。

因此,使用标准 ConcurrentLinkedQueue(我现在正在使用)的选项已过时。

我正在考虑使用优先级队列,但是我必须为每个元素关联一个标志,告诉我这个元素是否已经被某个线程使用。

哪种数据结构最适合这个问题?

最佳答案

听起来你真的应该有两个队列:

  • 未处理
  • 进行中

消费者将自动(通过锁)从未处理的队列中拉出并添加到正在进行的队列中。这样多个消费者可以同时工作……但生产者仍然可以在需要时拍摄两个队列的快照。当消费者完成一项任务时,它会将其从正在进行的队列中删除。 (这并不真的需要是一个队列,因为没有任何东西从中“拉出”。只是一些你可以轻松添加和删除的集合。)

鉴于您需要锁定以使传输成为原子,您可能不需要底层队列是并发队列 - 您将已经保护所有共享访问。

关于java - 为生产者消费者问题的变体选择数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816189/

相关文章:

java - 一种更快(更)的方法来查找与列表中的模式匹配的内容

java - RestTemplate 不转义 url

java - 如何计算 "Java Project"中的行数

data-structures - 为什么散列和 BST 的复杂性不考虑处理 key 字节所需的时间?

algorithm - 如何检查循环单链表是否为回文?

data-structures - push()ing 和 pop()ping 是如何定义的?

java - 动态更改 Material 按钮背景不起作用

c# - 任务并行库中的优先队列

java批量生产者消费者

c - 生产者/消费者 : 1 producer, 多个消费者 - 1 个信号量、1 个互斥量、1 个条件变量