BlockingQueue-一个生产者多个消费者

时间:2020-03-07 21:54:14

标签: java multithreading thread-safety producer-consumer blockingqueue

我有三个线程。线程1(T1)是生产者,它生成数据。线程2和3(分别为T2,T3)分别等待T1的数据在单独的循环中进行处理。我正在考虑在线程之间共享BlockingQueue,并通过调用“ take”让T2和T3等待。

java.util.concurrent.BlockingQueue的docs说它可以“安全地与多个生产者和多个消费者一起使用”。从文档中试用该示例,似乎行为是允许一个消费者“获取”“ put”对象,而不是让所有消费者都接受它。因此,T2或T3都会获取数据,并且看起来好像它们交替出现。我希望当T1放入一些数据时,他们两个都能获得相同的数据。

我的问题是,BlockingQueue是正确的方法吗?我是否应该以不同的方式考虑这个问题?

1 个答案:

答案 0 :(得分:1)

类似于 Publish-Subscribe 的声音,您将数据发布到一个主题,所有注册的使用者都会收到该消息的副本。相反,队列仅将消息传递给单个注册使用者。我建议您重新考虑该组件的设计。

顾名思义,BlockingQueue(实际上是Queue实现)是一个允许添加和检查对象的队列。这些操作是线程安全的,这意味着例如在检查时没有两个线程会收到相同的对象。