考虑以下代码片段。 qIn
是一个 BlockingQueue
、LinkedBlockingQueue
实现
while (true) {
try {
// retrieved = qIn.poll(999, TimeUnit.MILLISECONDS); works
retrieved = qIn.poll(); // fails
if (retrieved != null)
consume(retrieved);
if (!Producer.isAddingData && qIn.size() == 0)
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
让我澄清一下有效
和失败
的含义。当我说 qIn.poll()
失败时,我指的是有时并非队列中的所有数据都被处理。
为什么需要等待(qIn.poll(999, TimeUnit.MILLISECONDS)
是必要的
retrieved = qIn.poll(999, TimeUnit.MILLISECONDS); // works
retrieved = qIn.poll(); // fails
什么时候总是执行以下检查?基本上检查是“如果您的生产者不再添加数据并且要从中提取数据的队列不包含数据,则中断”
if (!StopwordsFilter.isAddingData && qIn.size() == 0)
break;
我想知道,在什么情况下qIn.poll();
会失败?
定义如下,考虑到我们只有在没有东西可拿的时候才会中断,为什么会中断呢?
retrieves and removes the head of this queue, or returns null if this queue is empty.
PS:我应该补充一点,qIn.poll()
有时会失败,但并非总是失败
最佳答案
poll()
可以返回 null
因为信息尚未添加到队列中,这就是原因 - 但也许它可能会在几毫秒内添加。 poll() 根本不做任何等待。
如果您想等待...那么您将需要猜测等待时间的上限。没有真正好的方法来预测这一点,但你可能可以慷慨 - 如果我正确理解情况,你通常会很快地将东西添加到队列中。
关于java - 关于 LinkedBlockingQueue,需要澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169681/