我有一堆添加到的生产者线程BlockingQueue和一个接收对象的工作线程。现在,我想扩展它,以使两个工作线程可以接收对象,但是对对象执行不同的工作。这是一个转折: 我希望 两个 接收线程都处理已放在队列中的对象。
BlockingQueue
如果我继续使用BlockingQueue,则两个线程将争用对象,只有一个工作线程将获取对象。
因此,我正在寻找类似于BlockingQueue的东西,但是具有广播行为。
应用程序:生产者线程实际上是在创建性能度量,并且其中一个工作线程正在将度量写入文件,而另一个工作线程正在汇总统计信息。
我正在使用Java 6。
这样的机制存在吗?在Java SE中?别处?还是我需要自己编写代码?
我正在寻找占地面积小的解决方案-我不希望安装一些框架来做到这一点。
一种选择:具有 三个 阻塞队列。您的主要生产者将项目放入“广播”队列。然后,您拥有 该 队列的使用者, 该 使用者消耗每个项目,并将其放入其他两个队列中,每个队列都由一个使用者进行服务:
Q2 ---- Real Consumer 1 Q1 / Producer ---- Broadcast Consumer \ ---- Real Consumer 2 Q3
另外,您可以给生产者两个阻塞队列,然后让它把它生产的项目放入两个队列中。这不太优雅,但总体上稍微简单一些:)