java - 如何限制 LinkedTransferQueue 的大小?

标签 java concurrency java.util.concurrent

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

关于java - 如何限制 LinkedTransferQueue 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45938999/

相关文章:

java - 无法在Java中的特定目录中创建文件(系统找不到指定的路径)

java - 使用java获取REST Web服务中http请求的内容

c++ - CSocket::Send 是否存在性能问题?

java - 在循环中调用 url.openStream() 时停止线程执行

concurrency - 你能提供闭包比当前函数长寿的例子吗?

java - 在 java 中调用超时的阻塞方法调用

java - 同时合并列表 - CopyOnWriteArrayList 或 ConcurrentLinkedQueue 哪个更好?

java - java中对字符的操作

java - 如何在 java 中使用 sparkSubmit 更改 hdfs 中的用户

java - 多线程与 ThreadPoolExecutor