java - 关于 LinkedBlockingQueue,需要澄清

标签 java queue

考虑以下代码片段。 qIn 是一个 BlockingQueueLinkedBlockingQueue 实现

    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/

相关文章:

java - 将字节转换为文件输入流

java - 我可以仅 Autowiring 构造函数注入(inject)的多个参数之一吗?

node.js - 使用 Bull 队列如何重试具有更高优先级的失败作业?

vba - 多个用户写入单个日志文本文件

java - 使用 servlet 与持久性 java 应用程序对话

Java 灰度图像

java - 带有 ListenerPort 的 V5 消息传递提供程序

c++ - 查找具有唯一标签的前 K 个元素的算法

java - 不可变队列的需求是什么?

java - 如何将地理坐标转换为固定比例的像素?