我想要一个线程安全的容器来阻止调用者,直到一个项目可用。物品将以每秒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);
}
}
我无法找到问题的既定解决方案,并希望得到任何帮助。
答案 0 :(得分:0)
覆盖BlockingQueue的任何实现的add()和put()方法,首先检查元素是否已经在队列中。
像 -
@Override
public boolean add(T obj) {
if (contains(obj))
return true;
return super.add(obj);
}