我正在实现生产者/消费者模式并使用LinkedTransferQueue集合。
我不希望我的制作人超出某些内存限制。
目前我正在使用此检查,但从文档中 ,大小操作需要O(N)遍历。 对于我目前的实施,这很好,
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>(); if (producerStringLinkedTransferQueue.size() <= 5000) { producerStringLinkedTransferQueue.add(<some data>); }但有没有比我目前使用的方法更好的方法?
I am implementing the producer/consumer pattern and using LinkedTransferQueue collection.
I do not want my producer to exceed certain memory limitations.
Currently I am using this check, but from the documentation, size operation require O(N) traversal. For my current implementation it is fine,
LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>(); if (producerStringLinkedTransferQueue.size() <= 5000) { producerStringLinkedTransferQueue.add(<some data>); }but is there any better approach than the one, which I am currently using ?
最满意答案
如果你想在队列已满时不做任何事情(不要将其最旧的项目替换为例如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 }If you want do nothing when queue is full (not replace its oldest item as, for example, Apache commons collections CircularFifoQueue does), then you can wrap LinkedTransferQueue in your custom class and implement needed methods for calculating queue's size:
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 }更多推荐
发布评论