java 7/8中带有大小限制的linkedtransfer队列的任何替代方案?

时间:2018-02-20 11:09:08

标签: java apache-commons java.util.concurrent

为了实现生产者/消费者模式,我已经使用过了 LinkedTransferQueue

检查以下代码

while (true) {

    String tmp = new randomString();
    if (linkedTransferQueueString.size() < 10000) {
        linkedTransferQueueString.add(tmp);             
        }

}

从文档中,它指出大小是O(n)操作:(。因此,对于添加元素,它应该遍历整个集合。

是否有其他具有大小限制的并发收集队列? 在java standard collectionsapache concurrent collections

中找不到任何内容

3 个答案:

答案 0 :(得分:2)

@OP:你已经接受了答案并且它也是正确的,但是你仍然提高了赏金,所以我假设你更多地寻找这个概念,所以我只想对那部分进行说明。

现在,您的问题是您对O(n)的尺寸操作不满意,因此这意味着您的解决方案是:

  • 数据结构应该能够告诉您队列已满。
  • 尺寸操作应该在恒定时间内返回结果。

大小操作提供O(n)并不常见,但由于LinkedTransferQueue存在异步行为,因此遍历完整队列以确保队列中的元素数。否则,大多数队列实现会在恒定时间内为您提供大小结果,但您实际上不需要进行此大小检查,请继续阅读。

如果您对LinkedTransferQueue的目的有很强的依赖性,即你想根据元素在某个制作人的队列中出现的时间而出队,那么我认为没有其他选择,除了你可以做一些肮脏的事情,如扩展LinkedTransferQueue,然后自己追踪元素的数量,但很快就会变得一团糟,无法给出准确的结果,并可能给出近似的结果。

如果您对LinkedTransferQueue没有任何硬性依赖,那么您可以使用某种BlockingQueue,其中许多可以让您拥有“有界”队列(有限队列是您需要的某种方式或其他方式 - 例如,ArrayBlockingQueue是隐式限制的,您可以像LinkedBlockingQueue一样创建有界new LinkedBlockingQueue(100)。您可以查看其他队列的文档。

然后你可以使用队列的offer方法,如果队列已满,它将返回FALSE,所以如果你得到FALSE,那么你可以随意处理,所以你不需要这样做通过显式大小检查,您可以使用offer方法将元素简单地放入队列中,它将返回一个布尔值,指示元素是否已成功放入队列中。

答案 1 :(得分:1)

您是否尝试过ArrayBlockingQueue

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ArrayBlockingQueue.html

它具有大小限制和并发性。

此外,大小为O(1)。

public int size() {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        return count;
    } finally {
        lock.unlock();
    }
}

答案 2 :(得分:0)

请你通过BlockingQueue。 这是我在互联网上找到的最佳链接 - BlockingQueueBlockingQueue是一个接口,它位于包中 - java.util.concurrent ,它有多个实现: -

  1. ArrayBlockingQueue
  2. DelayQueue
  3. LinkedBlockingQueue
  4. PriorityBlockingQueue
  5. SynchronousQueue