如何阻止提供程序,直到阻止队列为空?

时间:2019-06-28 09:23:05

标签: java concurrency blockingqueue

通常,我想阻塞一个阻塞队列的提供者,直到队列变空,然后将一批元素放入队列中。

我在这里找到一个相对的问题:

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();
        }
    }
}

代码似乎还可以,但是我仍然怀疑它不是线程安全的,并且可能导致死锁。

我的实现是线程安全的吗?有更好的方法吗?

0 个答案:

没有答案