一尘不染

如何阻塞直到BlockingQueue为空?

java

我正在寻找一种方法来阻止直到a BlockingQueue为空。

我知道,在多线程环境中,只要有生产者将项目放入BlockingQueue,就可能会出现队列变空并且几秒钟后队列中充满项目的情况。

但是,如果只有 一个 生产者,则它可能要等待(并阻止)直到队列停止为空后再将其放入队列。

Java /伪代码:

// Producer code
BlockingQueue queue = new BlockingQueue();

while (having some tasks to do) {
    queue.put(task);
}

queue.waitUntilEmpty(); // <-- how to do this?

print("Done");

你有什么主意吗?

编辑 :我知道包装BlockingQueue和使用额外的条件可以解决问题,我只是问是否有一些预制的解决方案和/或更好的选择。


阅读 297

收藏
2020-12-03

共1个答案

一尘不染

使用wait()和的简单解决方案notify()

// Producer:
synchronized(queue) {
    while (!queue.isEmpty())
        queue.wait(); //wait for the queue to become empty
    queue.put();
}

//Consumer:
synchronized(queue) {
    queue.get();
    if (queue.isEmpty())
        queue.notify(); // notify the producer
}
2020-12-03