在LinkedBlockingQueue上,需要澄清

时间:2012-02-07 01:04:41

标签: java queue

请考虑以下代码段。 qInBlockingQueueLinkedBlockingQueue实施

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

让我通过worksfails澄清我的意思。当我说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()有时会失败,而不是所有时间

1 个答案:

答案 0 :(得分:1)

poll()可以返回null因为信息还没有被添加到队列中,这就是原因 - 但也许它可能会在几毫秒内添加。 poll()根本没有等待

如果你想等待......那么你需要猜测等待时间的上限。没有什么好方法可以预测这一点,但你可能很慷慨 - 如果我理解正确的情况,你通常会快速地将事情添加到队列中。