我使用PriorityBlockingQueue。它是线程安全的并且允许优先级。但我需要以下功能:
当新元素添加到队列并且队列大小相等时,则删除第一个(最低优先级)元素。 是否有一些符合我要求的队列?
答案 0 :(得分:1)
没有Collection同时提供排序,并发和有界容量,因此您必须选择其中两个功能并为第三个添加手写解决方案。
然而,使用PriorityBlockingQueue检查大小是微不足道的,同样是线程安全的:
while (myQueue.size() >= THRESHOLD) {
Element e = myQueue.poll();
if (e != null) {
process(e);
}
}
myQueue.add(newElement);
现在受过良好教育的多线程会立即发现我选择的非线程安全实现(只有计数,列表始终是线程安全的),但这可能没问题。可能发生的最糟糕的事情是,队列被超过限制,最多可以减少一个线程。因此,对于4个线程,队列可以处于极限+3,而对于100个线程,它可以处于极限+ 99。
现在,根据您使用的线程数以及保持低于限制的重要程度,您可以执行以下操作: