【发布时间】: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