0

目前我正在解决一个需要

  1. 要固定的元素数量。
  2. 如果超过固定大小,则删除前一个元素。移除政策目前是固定的
  3. LinkedHashMap是一种选择,但我需要收集是并发的。
  4. 应该支持类似的功能,BoundedQueue但是永远不应该阻塞它的线程,而是应该删除旧元素并插入新元素。
  5. PriorityBlockingQueuewithdrainTo方法是有效的选项,但我每次在插入元素之前都必须调用它。

你能建议我一个解决方案吗?不需要源代码。我只想知道解决问题的最佳方法。

提前致谢。

4

2 回答 2

1

收容宝贝。

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++ 中学到的设计中的一个基本概念是包含优于继承。在这种情况下,它是解决方案。

于 2013-04-10T09:44:05.437 回答
0

最简单的起点是查看 JDK 的 LinkedBlockingQueue 并创建一个替代实现,该实现在处理过度填充的 put 和 offer 方面有所不同。由于这发生在持有私有锁时,您不能覆盖子类中的行为。

于 2013-04-10T10:13:08.010 回答