请考虑以下代码段。 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();
}
}
让我通过works
和fails
澄清我的意思。当我说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();
失败的情况下?
定义如下,考虑到我们只有在没有任何东西可以打破的情况下,它为什么会破坏?
检索并删除此队列的头部,如果是,则返回null 队列是空的。
PS:我应该补充说qIn.poll()
有时会失败,而不是所有时间
答案 0 :(得分:1)
poll()
可以返回null
因为信息还没有被添加到队列中,这就是原因 - 但也许它可能会在几毫秒内添加。 poll()根本没有等待 。
如果你想等待......那么你需要猜测等待时间的上限。没有什么好方法可以预测这一点,但你可能很慷慨 - 如果我理解正确的情况,你通常会快速地将事情添加到队列中。