2013-06-26 112 views
1

我有一个情况,我有多个生产者和单个消费者。 由于性能方面的原因,我不希望消费者处于任何阻塞状态,但由于可能有更多的生产者,他们应该在队列满时“阻塞”。生产者消费者阻止队列

是否有任何队列为我提供这样的行为,或者如何根据需要修改ArrayBlockingQueue?

+0

阻挡ArrayBlockingQueue.put'ArrayBlockingQueue'不是终点,就可以延伸并覆盖其功能。 –

回答

0

任何BlockingQueue实现有什么问题?您的消费者可以拨打 peek() poll()这是非阻塞的,您的生产者可以拨打电话put(E e),如果队列已满,它会阻止。

UPDATE

如果使用的是一个令人难以置信的密集的任务队列,然后LMAX's disruptor ring buffer很可能是最高效的队列结构。

+0

我需要修改此锁定的工作方式。我可能无法正确理解这个概念。如果生产者获得了锁,并且它进入“等待”状态......那么消费者想要获得一些元素,并且还要在队列上执行“锁定” - 发生了什么?不生产者锁定? – hpet

+0

在调用poll()期间,消费者线程可能会将上下文切换出来,同时持有该锁,阻止其他消费者,但这很可能是短暂的。除非你有*显着*(每秒成千上万的队列访问次序),否则我不会期望它会引起你的问题。如果你*正在做一些密集的事情,那么看看LMAX的破坏者吧:http://lmax-exchange.github.io/disruptor/ – SimonC

2

使用非阻塞ArrayBlockingQueue.poll为消费者和生产者

+0

我可能对此无法正确理解,或者我表达了自己的不足,但看着ArrayBlockingQeueu的源代码,poll仍在获取一个锁,这意味着如果还有其他锁,它将排队等候轮到它......不?我不希望消费者参与锁定 - 只需从给定的索引中抓取并通知生产者即可。我已经用poll进行了这个实现,但是看起来消费者在某种程度上“饿死”,因为生产者池(等于队列长度)正在竞争并等待(持有我假设的锁)。 – hpet

+0

好吧,你说过你不想阻塞,并且不会阻止任何人投票。至于锁定,恐怕你不能做无锁的BlockingQueue,因为它需要等待/以某种方式通知 –