【问题标题】:BlockingQueue - one producer multiple consumersBlockingQueue - 一个生产者多个消费者
【发布时间】:2020-03-07 21:54:14
【问题描述】:

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

java.util.concurrent.BlockingQueue 的docs 表示它可以“安全地用于多个生产者和多个消费者”。试用文档中的示例,似乎行为是允许一个消费者“获取”“放置”对象,而不是所有人都接收它。因此,无论是 T2 还是 T3 都会获取数据,并且看起来好像它们是交替的。我希望他们在 T1 放一些数据时得到相同的数据。

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

【问题讨论】:

  • 通常在一个队列中,只有一个消费者从队列中获取一个元素。在超市排队时,您只有一个收银员,而不是每个收银员。如果您希望 T1 生成的每个项目被处理两次(一次由 T2 处理,一次由 T3 处理),您将需要为每个消费者创建一个单独的队列。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!对于任何好奇的人,我实现了一个 Pub/Sub,每个订阅者都有自己的 BlockingQueue。发布者在发布时调用“放置”,订阅者通过从各自的 BlockingQueue 中“获取”来等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多