我正在实现生产者/消费者模式并使用LinkedTransferQueue集合。
我不希望我的生产者超出某些内存限制。
当前,我正在使用此检查,但是从documentation进行大小操作需要O(N)遍历。就我目前的实施而言,这很好
但是有没有比我目前更好的方法了
使用?
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>();
if (producerStringLinkedTransferQueue.size() <= 5000) {
producerStringLinkedTransferQueue.add(<some data>);
}
最佳答案
如果您不想在队列已满时不执行任何操作(例如,不替换其最早的项,例如Apache Commons Collections 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
}