如何限制 LinkedTransferQueue 的大小?
How can I restrict the size of the LinkedTransferQueue?
我正在实施 producer/consumer 模式并使用 LinkedTransferQueue 集合。
我不希望我的制作人超出某些内存限制。
目前我正在使用这个检查,但是从documentation开始,大小操作需要O(N)遍历。对于我当前的实现来说很好,
but is there any better approach than the one, which I am currently
using ?
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>();
if (producerStringLinkedTransferQueue.size() <= 5000) {
producerStringLinkedTransferQueue.add(<some data>);
}
如果你不想在队列已满时不做任何事情(而不是像 Apache commons collections CircularFifoQueue
那样替换它最旧的项目),那么你可以将 LinkedTransferQueue
包装在你的自定义 class 并实现计算队列大小所需的方法:
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
}
我正在实施 producer/consumer 模式并使用 LinkedTransferQueue 集合。
我不希望我的制作人超出某些内存限制。
目前我正在使用这个检查,但是从documentation开始,大小操作需要O(N)遍历。对于我当前的实现来说很好,
but is there any better approach than the one, which I am currently using ?
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>();
if (producerStringLinkedTransferQueue.size() <= 5000) {
producerStringLinkedTransferQueue.add(<some data>);
}
如果你不想在队列已满时不做任何事情(而不是像 Apache commons collections CircularFifoQueue
那样替换它最旧的项目),那么你可以将 LinkedTransferQueue
包装在你的自定义 class 并实现计算队列大小所需的方法:
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
}