我有一个情况,我有多个生产者和单个消费者。 由于性能方面的原因,我不希望消费者处于任何阻塞状态,但由于可能有更多的生产者,他们应该在队列满时“阻塞”。生产者消费者阻止队列
是否有任何队列为我提供这样的行为,或者如何根据需要修改ArrayBlockingQueue?
我有一个情况,我有多个生产者和单个消费者。 由于性能方面的原因,我不希望消费者处于任何阻塞状态,但由于可能有更多的生产者,他们应该在队列满时“阻塞”。生产者消费者阻止队列
是否有任何队列为我提供这样的行为,或者如何根据需要修改ArrayBlockingQueue?
任何BlockingQueue
实现有什么问题?您的消费者可以拨打
peek()
poll()
这是非阻塞的,您的生产者可以拨打电话put(E e)
,如果队列已满,它会阻止。
UPDATE
如果使用的是一个令人难以置信的密集的任务队列,然后LMAX's disruptor ring buffer很可能是最高效的队列结构。
使用非阻塞ArrayBlockingQueue.poll
为消费者和生产者
我可能对此无法正确理解,或者我表达了自己的不足,但看着ArrayBlockingQeueu的源代码,poll仍在获取一个锁,这意味着如果还有其他锁,它将排队等候轮到它......不?我不希望消费者参与锁定 - 只需从给定的索引中抓取并通知生产者即可。我已经用poll进行了这个实现,但是看起来消费者在某种程度上“饿死”,因为生产者池(等于队列长度)正在竞争并等待(持有我假设的锁)。 – hpet
好吧,你说过你不想阻塞,并且不会阻止任何人投票。至于锁定,恐怕你不能做无锁的BlockingQueue,因为它需要等待/以某种方式通知 –
阻挡
ArrayBlockingQueue.put
'ArrayBlockingQueue'不是终点,就可以延伸并覆盖其功能。 –