如何在使用LinkedBlockingQueue时优先考虑消费者?

我正在使用LinkedBlockingQueue和生产者/消费者模式一起来缓冲任务。 将任务添加到队列中我使用了我的生产者的方法:Queue.put(Object); 为我的消费者使用队列中的任务:Queue.take(Object);

我在Java API中发现,这两种方法都会阻塞,直到队列变为可用。 我的问题是:我知道有一个事实,即我的系统中有更多的生产者,然后是消费者。 我所有的任务都需要处理。 所以我需要我的消费者在被阻止时优先于生产者获得队列。

他们是否在不更改LinkedBlockingQueue方法的情况下做到这一点?


LinkedBlockingQueue使用两个ReenterantLocks锁。

private final ReentrantLock putLock = new ReentrantLock();

private final ReentrantLock takeLock = new ReentrantLock();

由于这两个锁是分开的,并且为了执行其操作阻塞而采取锁定锁,一个操作不会影响其他操作。

干杯!


没有必要将消费者优先于生产者,因为它们在完全不同的条件下阻塞:如果生产者由于队列已满而被阻塞,那么由于队列为空,消费者不会被阻塞。

例如,由于队列已满,producer1有一个阻止put呼叫。 然后,消费者1执行take ,这是正常进行的,因为队列不是空的(除非你的队列的容量为0,这将是愚蠢的) - 消费者不知道或关心生产者的put call被阻塞,所有关心关于这个队列是不是空的。


由于多个独立的锁,被阻止的生产者不会阻止消费者。

take(状态:

检索并删除此队列的头部,如果需要等待,直到元素变为可用。

put(说:

在该队列的尾部插入指定的元素,等待空间变得可用时

如果没有空间,那么放置会阻塞,但不会被阻塞,因为它的设计只在队列为空时才显示,显然不是这种情况。


原创评论:

据我所知,这个队列在设计上不会阻止消费者,即使生产者由于队列已满而被阻塞。

链接地址: http://www.djcxy.com/p/21511.html

上一篇: How do I give priority to Consumers when using a LinkedBlockingQueue?

下一篇: akka actor post a message to head of the MailBox