现在,我有一个队列,有多个生产者和一个消费者。
消费者线程运行缓慢。另外,consumer通过peek操作从queue中获取元素,在消费操作完成之前,不能将元素从queue中移除。这是因为作为辅助操作的生产者线程还会对在该时间点未完全处理的所有元素进行快照。
现在,我想更改我的代码以支持多个消费者。所以,假设我有三个线程,一个线程将获取第一个元素,可以通过 peek 操作读取它。 第二个消费者线程可以获取第二个元素,但我无法检索它,因为队列不支持检索第二个元素。
因此,使用标准 ConcurrentLinkedQueue(我现在正在使用)的选项已过时。
我正在考虑使用优先级队列,但是我必须为每个元素关联一个标志,告诉我这个元素是否已经被某个线程使用。
哪种数据结构最适合这个问题?
最佳答案
听起来你真的应该有两个队列:
- 未处理
- 进行中
消费者将自动(通过锁)从未处理的队列中拉出并添加到正在进行的队列中。这样多个消费者可以同时工作……但生产者仍然可以在需要时拍摄两个队列的快照。当消费者完成一项任务时,它会将其从正在进行的队列中删除。 (这并不真的需要是一个队列,因为没有任何东西从中“拉出”。只是一些你可以轻松添加和删除的集合。)
鉴于您需要锁定以使传输成为原子,您可能不需要底层队列是并发队列 - 您将已经保护所有共享访问。
关于java - 为生产者消费者问题的变体选择数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5816189/