Java 具有可配置删除策略的并发固定大小集合

Java 具有可配置删除策略的并发固定大小集合,java,collections,concurrency,Java,Collections,Concurrency,目前我正在处理一个需要 要固定的元素数 如果上一个图元超过固定大小,则删除它。删除策略目前是固定的 LinkedHashMap是一个选项,但我需要同时收集 应该支持像BoundedQueue这样的功能,但是不应该阻止包含它的线程,而应该删除旧元素并插入新元素 PriorityBlockingQueuewithdrainTo方法是有效的选项,但每次插入元素之前,我都必须调用它 你能给我一个解决方案吗。源代码不是必需的。我只想知道解决这个问题的最好办法 提前谢谢。宝贝 public class My

目前我正在处理一个需要

  • 要固定的元素数
  • 如果上一个图元超过固定大小,则删除它。删除策略目前是固定的
  • LinkedHashMap
    是一个选项,但我需要同时收集
  • 应该支持像
    BoundedQueue
    这样的功能,但是不应该阻止包含它的线程,而应该删除旧元素并插入新元素
  • PriorityBlockingQueue
    with
    drainTo
    方法是有效的选项,但每次插入元素之前,我都必须调用它
  • 你能给我一个解决方案吗。源代码不是必需的。我只想知道解决这个问题的最好办法

    提前谢谢。

    宝贝

    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. 
    }
    
    公共类MyCollection{
    私有LinkedBlockingQueue lbq=新LinkedBlockingQueue();
    公共静态最终int MAX_SIZE=5;
    公共作废添加(MyData输入){
    lbq.put(输入);
    如果(lbq>MAX_SIZE)lbq.poll();
    }
    …您需要的任何其他方法。
    }
    
    这可能并不完全符合您的需求,但这应该会让您朝着正确的方向开始。您可以使用现有的数据结构,使用一些自定义代码对其进行包装(包括使其线程安全),然后您就可以得到所需的数据结构


    设计中的一个基本概念,我认为从有效C++中学习的是,包容优于继承。在本例中,这就是解决方案。

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

    这看起来不像它可以处理同时的
    add
    s。正如我所说:“这可能不完全符合您的需要”。我很肯定@AmitD知道他在开发软件方面做了什么。我这篇文章的目的是让他朝着正确的方向开始,他可以从那里开始。我可能提供了太多的信息,但这是为了让其他没有那么有成就的人获得一些见解。