Java 阻塞队列式容器,该容器不';不允许重复

Java 阻塞队列式容器,该容器不';不允许重复,java,thread-safety,java.util.concurrent,blockingqueue,Java,Thread Safety,Java.util.concurrent,Blockingqueue,我想要一个线程安全的容器,在项目可用之前阻止调用者。物品将以每秒1000秒的速度添加到此容器中,但不会以相同的速度排放。因此,我希望容器不允许重复。 我围绕LinkedBlockingQueue编写了一个非常简单的包装器,但很快就意识到我已经重新创建了经典的生产者-消费者死锁。这是我写的: public class ActivityListener { private final BlockingQueue<ID> activeItems = new LinkedBlocki

我想要一个线程安全的容器,在项目可用之前阻止调用者。物品将以每秒1000秒的速度添加到此容器中,但不会以相同的速度排放。因此,我希望容器不允许重复。 我围绕LinkedBlockingQueue编写了一个非常简单的包装器,但很快就意识到我已经重新创建了经典的生产者-消费者死锁。这是我写的:

public class ActivityListener {
    private final BlockingQueue<ID> activeItems = new LinkedBlockingQueue<>();

    public synchronized ID take() throws InterruptedException {
        return activeItems.take();
    }

    public synchronized void registerActivity(final ID item) {
        if (!activeItems.contains(item)) {
            activeItems.add(item);
        }
    }

    public synchronized boolean isItemActive(final ID item) {
        return activeItems.contains(item);
    }
}
公共类活动侦听器{
private final BlockingQueue activeItems=新建LinkedBlockingQueue();
public synchronized ID take()引发InterruptedException{
返回activeItems.take();
}
公共同步无效注册表活动(最终ID项){
如果(!activeItems.contains(item)){
activeItems.add(item);
}
}
公共同步布尔isItemActive(最终ID项){
返回活动项。包含(项);
}
}
我找不到解决问题的既定解决方案,非常感谢您的帮助。

覆盖BlockingQueue任何实现的add()和put()方法,以首先检查元素是否已在队列中

类似于-

@Override
public boolean add(T obj) {
    if (contains(obj))
        return true;
    return super.add(obj);
}
重写BlockingQueue的任何实现的add()和put()方法,以首先检查元素是否已在队列中

类似于-

@Override
public boolean add(T obj) {
    if (contains(obj))
        return true;
    return super.add(obj);
}

这不是线程安全的,不幸的是可能无法做到这一点(至少在一般情况下)。此外,当对象未添加到集合中时,从集合类接口上的add方法返回true是非常不习惯的。这不是线程安全的,不幸的是可能无法做到这一点(至少在一般情况下)。此外,当对象未添加到集合中时,在类似集合的接口上从add方法返回true是非常不习惯的。您需要完整的BlockingQueue实现还是只需要
put()
take()
?我只需要put和take可能的副本:您需要完整的BlockingQueue实现还是只需要
put()
take()
?我只需要put和take可能的副本: