2016-05-29 21 views
4

在生产者 - 消费者问题中,我想使用LinkedBlockingQueue作为共享缓冲区。BlockingQueue有最大阻塞时间

生产者线程使用put()方法在队列上放置一个元素,使用者线程使用take()方法消耗队列中的元素。

我的问题是:说如果队列是空的,并且消费者线程调用take()方法,我知道线程被阻塞,直到生产者将一个元素放到队列中。但有没有像最大阻滞持续时间?我可以安全地假设消费者线程将被阻止,直到拨打put()

我听到有人说永远没有像块一样的东西。这是真的吗?

回答

5

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

获取并移除此队列的头,如有必要则等待直到元素变得可用

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

1

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

所以是的,它会一直等到条件满足为止,这意味着有人在那里放置一个元素。