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().
请让我知道这个解决方案是否有意义.
非常感谢!
您可以使用框架中的主题。
在activemq http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html
在 hornetq 中HornetQ 中 JMS 主题的确切示例
| 归档时间: |
|
| 查看次数: |
2192 次 |
| 最近记录: |