【问题标题】:How can I restrict the size of the LinkedTransferQueue?如何限制 LinkedTransferQueue 的大小?
【发布时间】:2017-08-29 12:19:50
【问题描述】:

我正在实现生产者/消费者模式并使用 LinkedTransferQueue 集合。

我不希望我的制作人超出某些内存限制。

目前我正在使用此检查,但从documentation 开始,大小操作需要 O(N) 遍历。对于我目前的实现,这很好,

但是有没有比我目前使用的更好的方法 使用?

LinkedTransferQueue<String> producerStringLinkedTransferQueue = new LinkedTransferQueue<String>();

if (producerStringLinkedTransferQueue.size() <= 5000) {
    producerStringLinkedTransferQueue.add(<some data>);
}

【问题讨论】:

标签: java concurrency java.util.concurrent


【解决方案1】:

如果您不想在队列已满时不执行任何操作(而不是像 Apache 公共集合 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
}

【讨论】:

  • 非常好的解决方案。值得实现一些接口,例如Iterable。您可以(并且应该)通过删除Integer.MAX_VALUE 使maxSize 成为最终版本。它也不是线程安全的——LinkedTransferQueue 是一个并发集合,所以我希望一个有限的集合也是线程安全的。
  • 是的,你是对的。我已经编辑了maxSize 的答案,还需要改进线程安全的代码。
猜你喜欢
  • 2011-01-19
  • 2019-02-27
  • 1970-01-01
  • 2011-09-06
  • 2021-11-06
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多