如何限制LinkedTransferQueue的大小?(How can I restrict the size of the LinkedTransferQueue?)

编程入门 行业动态 更新时间:2024-10-28 22:29:09
如何限制LinkedTransferQueue的大小?(How can I restrict the size of the LinkedTransferQueue?)

我正在实现生产者/消费者模式并使用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,

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包装在自定义类中并实现计算队列大小所需的方法:

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 }

更多推荐

本文发布于:2023-07-23 11:55:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1231585.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:大小   LinkedTransferQueue   size   restrict

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!