2016-05-29 58 views
4

在生產者 - 消費者問題中,我想使用LinkedBlockingQueue作爲共享緩衝區。BlockingQueue有最大阻塞時間

生產者線程使用put()方法在隊列上放置一個元素,使用者線程使用take()方法消耗隊列中的元素。

我的問題是:說如果隊列是空的,並且消費者線程調用take()方法,我知道線程被阻塞,直到生產者將一個元素放到隊列中。但有沒有像最大阻滯持續時間?我可以安全地假設消費者線程將被阻止,直到撥打put()

我聽到有人說永遠沒有像塊一樣的東西。這是真的嗎?

回答

5

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

獲取並移除此隊列的頭,如有必要則等待直到元素變得可用

另一方面,poll方法可以將超時作爲參數。

1

如果看一下LinkedBlockingQueue的實現方法take()方法 它在一個循環中等待notEmpty條件,只有當count變爲非零時纔會退出。

所以是的,它會一直等到條件滿足爲止,這意味着有人在那裏放置一個元素。