如何限制LinkedTransferQueue的大小?

时间:2017-08-29 12:19:51

标签: java concurrency java.util.concurrent

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

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

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

  

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

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

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

1 个答案:

答案 0 :(得分:1)

如果你想在队列已满时不做任何事情(不要将其最旧的项目替换为例如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
}