BlockingQueue 是否有最大阻塞时间

Is there a max blocking time on BlockingQueue

在生产者-消费者问题中,我想使用LinkedBlockingQueue作为共享缓冲区。

生产者线程使用 put() 方法将元素放入队列,消费者线程使用 take() 方法使用队列中的元素。

我的问题是:如果队列为空并且消费者线程调用 take() 方法,我知道线程被阻塞,直到生产者将一个元素放入队列。但是是否有类似最大块持续时间的东西?我可以安全地假设消费者线程将被阻塞直到 put() 调用吗?

我听说有人说没有什么比永远的块。是真的吗?

不,take() 方法中没有等待超时。 documentation 没有提到任何超时:

Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.

另一方面,poll 方法可以将超时作为参数。

如果你看一下LinkedBlockingQueue的take()方法的实现 它在循环中等待 notEmpty 条件,只有当计数变为非零时才会退出。

所以是的,它将永远等待直到条件满足,这意味着有人将元素放在那里。