В общем, я хочу заблокировать поставщика очереди блокировки, пока очередь не станет пустой, а затем поместить пакет элементов в очередь.
Я нахожу здесь относительный вопрос:
Как заблокировать, пока BlockingQueue не опустеет?
Однако я все еще в замешательстве.
моя текущая реализация похожа на (псевдокод):
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();
}
}
}
Кажется, что код в порядке, но я все еще сомневаюсь, что он не является поточно-ориентированным и может привести к мертвой блокировке.
Является ли моя реализация поточно-ориентированной? Есть ли лучший способ сделать это?