Как заблокировать провайдера с помощью очереди блокировки становится пустой? - PullRequest
0 голосов
/ 28 июня 2019

В общем, я хочу заблокировать поставщика очереди блокировки, пока очередь не станет пустой, а затем поместить пакет элементов в очередь.

Я нахожу здесь относительный вопрос:

Как заблокировать, пока 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();
        }
    }
}

Кажется, что код в порядке, но я все еще сомневаюсь, что он не является поточно-ориентированным и может привести к мертвой блокировке.

Является ли моя реализация поточно-ориентированной? Есть ли лучший способ сделать это?

...