如何实现具有多个使用者和多个队列的消费者 - 生产者

use*_*712 8 java concurrency messaging producer-consumer java.util.concurrent

假设有1个生产者P和2个消费者C1和C2.并且有2个队列Q1和Q2,都具有特定容量.

P将生产物品并交替进入Q1和Q2.物品是为特定消费者生产的,不能被其他消费者消费.我如何在Java中实现以下内容:在我启动3个线程后,如果Q1为空,则线程C1被阻塞,直到在Q1中存在某些内容时通知它.Q2也是如此.当Q1和Q2都满时,P将被阻止,直到Q1或Q2未满时通知.

我正在考虑使用BlockingQueue,它会在队列为空时阻止使用者.但问题是当其中一个队列已满时,生产者将被阻止.我们可以使用Java中的任何数据结构来解决这个问题吗?

更新

我自己有一个解决方案,但我不确定它是否有效.我们仍然可以有2个BlockingQueues.当消费者从其队列中获取项目时,它会使用BlockingQueue.take(),因此当队列中没有项目时它将被阻止.当生产者将项目添加到任一队列时,它使用BlockingQueue.offer().因此,它永远不会被此操作阻止,并且如果队列已满,它将变为"false".另外,我们保留一个AtomicInteger来指示未满的队列数.每当生产者P想要将一个项目放入队列时,如果它得到错误的返回,我们将AtomicInteger减少1.当它达到0时,生成器调用AtomicInteger.wait().每当消费者从其队列中获取项目时,它也会检查AtomicInteger.当它为0时,消费者将其增加1并进行呼叫AtomicInteger.notify().

请让我知道这个解决方案是否有意义.

非常感谢!