【发布时间】:2015-07-10 20:59:39
【问题描述】:
我想要一个线程安全的容器,它会阻塞调用者,直到项目可用。物品将以每秒 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);
}
}
我找不到解决问题的既定方法,希望能提供任何帮助。
【问题讨论】:
-
你需要一个完整的 BlockingQueue实现还是只需要
put()和take()? -
我只需要即插即用
标签: java thread-safety java.util.concurrent blockingqueue