生产者/消费者:一个生产者,多个消费者,每个人都在相同的数据上工作

时间:2014-05-24 09:22:35

标签: java multithreading producer-consumer

我有一个制作人/消费者场景,我不想让一个制作人提供产品和多个消费者来消费这些产品。但是,常见的情况是,交付的产品仅由一个消费者消费,而其他消费者从未看到此特定产品。我要做的就是每个消费者只消费一次产品而不会有任何阻塞。

我的第一个想法是使用多个BlockingQueues,每个消费者一个,并使Producer将每个产品按顺序放入所有可用的BlockingQueues中。但是,如果其中一个队列阻塞(例如,队列已满),则生产者不能继续。另一方面,为每个产品生成一个新的Thread以将产品放入队列似乎不是一个好的解决方案,因为如果队列已满,将创建越来越多的线程。

问题是,在我的场景中,一个消费者可能需要更多的时间来处理产品而不是另一个消费者,具体取决于输入。调整BlockingQueues的容量也很困难,因为消费者的处理时间实际上是不可预测的。

可以想到更优雅的解决方案吗?或者是否可以动态增加/减少BlockingQueues的容量以平衡填充水平?

2 个答案:

答案 0 :(得分:1)

看起来你需要JMS的发布/订阅风格,你可以尝试ActiveMQ http://activemq.apache.org/download.html,它有很多选项,你一定会找到最适合你需求的选项

答案 1 :(得分:1)

看看Guava的EventBus,它是Guava图书馆的一部分,用于处理正在进行的PubSub式沟通。它可能适合您的需求,让您免于重新发明一些轮子。

如果您正在寻找进程间通信,请考虑像Evgeniy提议的消息队列。