通常,我想阻塞一个阻塞队列的提供者,直到队列变空,然后将一批元素放入队列中。
我在这里找到一个相对的问题:
How to block until a BlockingQueue is empty?
但是我仍然感到困惑。
我当前的实现就像(伪代码):
BlockingQueue blockingQueue = new BlockingQueue();
// provider code
while (true) {
// wait until the blocking queue becomes empty
synchronized (blockingQueue) {
while (!blockingQueue.isEmpty()) {
blockingQueue.wait();
}
}
// put a batch of elements into blocking queue
List<Element> elementList = getSomeElements();
for (Element element : elementList) {
blockingQueue.put(element)
}
}
// consumer code
while (true) {
// take a element
blockingQueue.take();
// if the blocking queue becomes empty, notify the provider
synchronized (blockingQueue) {
if (blockingQueue.isEmpty()) {
blockingQueue.notify();
}
}
}
代码似乎还可以,但是我仍然怀疑它不是线程安全的,并且可能导致死锁。
我的实现是线程安全的吗?有更好的方法吗?