如何限制LinkedTransferQueue的大小?
问题描述:
我正在实施生产者/消费者模式并使用LinkedTransferQueue集合。如何限制LinkedTransferQueue的大小?
我不希望我的制作者超出某些内存限制。
目前我正在使用此检查,但从documentation开始,大小操作需要O(N)遍历。对于我目前的实现中,它是好的,
但没有任何比一个更好的办法,我目前使用 ?
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>();
if (producerStringLinkedTransferQueue.size() <= 5000) {
producerStringLinkedTransferQueue.add(<some data>);
}
答
如果你想要做什么,当队列已满(不是取代它的最古老的项目,例如,Apache的公共集合CircularFifoQueue
一样),那么你可以用你的自定义类LinkedTransferQueue
和实施都需要的方法计算队列大小:
public class LimitLinkedTransferQueue<E> {
LinkedTransferQueue<E> queue = new LinkedTransferQueue<>();
private final long maxSize;
private long size = 0;
public LimitLinkedTransferQueue(long maxSize) {
super();
this.maxSize = maxSize;
}
public boolean add(E e) {
if (this.size == this.maxSize){
return false;
}
boolean result = queue.add(e);
if (result) {
size++;
}
return result;
}
public E take() throws InterruptedException {
E item = queue.take();
size--;
return item;
}
// other need methods
}
这当然不是这样做的。 [“确定当前元素数量...如果在遍历过程中修改了此集合,则可能会报告不准确的结果。”](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ LinkedTransferQueue.html) – Michael
同意:),因为我不必对尺寸验证非常严格,我使用这种方法,但不应该使用它,如果尺寸验证非常严格 –