如何在使用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?