在以下场景中,终结器线程必须等待使用者线程处理所有队列元素才能完成执行:
private final BlockingQueue<Object> queue = new LinkedBlockingQueue<>();
private final Object queueMonitor = new Object();
// Consumer thread
while (true) {
Object element = queue.take();
consume(element);
synchronized (queueMonitor) {
queueMonitor.notifyAll();
}
}
// Finalizer thread
synchronized (queueMonitor) {
while (!queue.isEmpty()) {
queueMonitor.wait();
}
}
元素随时间添加到队列中。
使用者守护进程线程一直运行,直到JVM终止,此时必须允许它完成对所有排队元素的处理。
问题:
false
,因此在
consume()
还没回来因为在等
queueMonitor
研究:
理想的解决方案是
peek the queue
,然后在元素被使用后将其移除。