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

Java BlockingQueue-一个生产者多个消费者,java,multithreading,thread-safety,producer-consumer,blockingqueue,Java,Multithreading,Thread Safety,Producer Consumer,Blockingqueue,我有三根线。线程1(T1)是生成数据的生产者。线程2和线程3(分别是T2和T3)都等待T1的数据在单独的循环中处理。我正在考虑在线程之间共享一个阻塞队列,并通过调用“take”让T2和T3等待 for java.util.concurrent.BlockingQueue表示,它可以“安全地与多个生产者和多个消费者一起使用”。从文档中尝试这个例子,似乎行为是允许一个消费者“接受”这个“put”对象,而不是让所有消费者都接受它。因此,T2或T3都会获得数据,并且看起来好像它们是交替的。我希望当T1放

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

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

我的问题是,阻塞队列是正确的方法吗?我应该以不同的方式思考这个问题吗?

听起来像发布-订阅,您将数据发布到某个主题,所有注册的消费者都会收到该消息的副本。相反,队列仅向单个注册的使用者传递消息。我建议你重新考虑一下那个部件的设计


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

通常在队列中,只有一个使用者从队列中获取一个元素。在超市排队时,只有一个收银员为你服务,不是每个收银员都有。如果您想让T1生产的每件商品处理两次(一次由T2处理,一次由T3处理),您需要为每个消费者单独排队。谢谢!对于任何好奇的人,我实现了一个Pub/Sub,每个订阅者都有自己的BlockingQueue。发布者在发布时调用“put”,订阅者从各自的阻止队列中通过“take”等待。