BlockingQueue就像不允许重复的容器一样

时间:2015-07-10 20:59:39

标签: java thread-safety java.util.concurrent blockingqueue

我想要一个线程安全的容器来阻止调用者,直到一个项目可用。物品将以每秒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);
    }
}

我无法找到问题的既定解决方案,并希望得到任何帮助。

1 个答案:

答案 0 :(得分:0)

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

像 -

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