目前我正在解决一个需要
- 要固定的元素数量。
- 如果超过固定大小,则删除前一个元素。移除政策目前是固定的
LinkedHashMap
是一种选择,但我需要收集是并发的。- 应该支持类似的功能,
BoundedQueue
但是永远不应该阻塞它的线程,而是应该删除旧元素并插入新元素。 PriorityBlockingQueue
withdrainTo
方法是有效的选项,但我每次在插入元素之前都必须调用它。
你能建议我一个解决方案吗?不需要源代码。我只想知道解决问题的最佳方法。
提前致谢。
目前我正在解决一个需要
LinkedHashMap
是一种选择,但我需要收集是并发的。BoundedQueue
但是永远不应该阻塞它的线程,而是应该删除旧元素并插入新元素。PriorityBlockingQueue
withdrainTo
方法是有效的选项,但我每次在插入元素之前都必须调用它。你能建议我一个解决方案吗?不需要源代码。我只想知道解决问题的最佳方法。
提前致谢。
收容宝贝。
public class MyCollection {
private LinkedBlockingQueue<MyData> lbq = new LinkedBlockingQueue<MyData>();
public static final int MAX_SIZE = 5;
public void add(MyData input) {
lbq.put(input);
if(lbq > MAX_SIZE) lbq.poll();
}
... any other methods you need.
}
这可能不完全符合您的需求,但这应该让您朝着正确的方向开始。您可以使用现有的数据结构,用一些自定义代码包装它(包括使其成为线程安全的),您就可以得到您所需要的。
我认为从 Effective C++ 中学到的设计中的一个基本概念是包含优于继承。在这种情况下,它是解决方案。
最简单的起点是查看 JDK 的 LinkedBlockingQueue 并创建一个替代实现,该实现在处理过度填充的 put 和 offer 方面有所不同。由于这发生在持有私有锁时,您不能覆盖子类中的行为。