我有一個對象阻塞隊列。java BlockingQueue沒有阻止偷看?
我想寫一個線程,直到隊列中有一個對象。類似於BlockingQueue.take()提供的功能。
但是,因爲我不知道我是否能夠成功處理對象,所以我只想偷看()而不是刪除對象。我想只在我能夠成功處理它時才移除該對象。
所以,我想要一個阻塞peek()函數。目前,如果按照javadocs排隊,peek()只會返回。
我錯過了什麼嗎?有沒有另外一種方法來實現這個功能?
編輯:
,如果我只是使用一個線程安全的隊列和偷看,睡着了,而不是有什麼想法?
public void run() {
while (!__exit) {
while (__queue.size() != 0) {
Object o = __queue.peek();
if (o != null) {
if (consume(o) == true) {
__queue.remove();
} else {
Thread.sleep(10000); //need to backoff (60s) and try again
}
}
}
Thread.sleep(1000); //wait 1s for object on queue
}
}
請注意,我只有一個消費者線程和一個(單獨的)生產者線程。我想這不像使用BlockingQueue那麼高效......任何意見都會被讚賞。
這是一個很好的建議。我在這裏可以看到的唯一問題是,如果隊列在我正在處理項目時填滿,那麼我將無法將當前項目排回。 – rouble 2009-11-18 23:56:58
您可以通過在包裝器實現中使用額外的同步來解決這個問題,因此使得take + put成爲一個原子操作。你也可以使用無界隊列。 – Adamski 2009-11-19 00:09:20
我建議不要刪除和重新添加,因爲那樣你就有麻煩將隊列的狀態更改暴露給其他線程。也許使用忙碌輪詢來實現peek()。或者,如果您不想輪詢,請使用綁定到包裝器隊列中的信號量。 – 2016-11-22 21:14:26