为了实现生产者/消费者模式,我已经使用过了 LinkedTransferQueue。
检查以下代码
while (true) {
String tmp = new randomString();
if (linkedTransferQueueString.size() < 10000) {
linkedTransferQueueString.add(tmp);
}
}
从文档中,它指出大小是O(n)操作:(。因此,对于添加元素,它应该遍历整个集合。
是否有其他具有大小限制的并发收集队列? 在java standard collections,apache concurrent collections?
中找不到任何内容答案 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
。
这是我在互联网上找到的最佳链接 - BlockingQueue。 BlockingQueue
是一个接口,它位于包中 - java.util.concurrent ,它有多个实现: -
ArrayBlockingQueue
DelayQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronousQueue