我有一个阻塞对象队列。
我想编写一个线程,它会一直阻塞到队列中有一个对象为止,就像BlockingQueue.take()函数提供的功能一样。
然而,由于我不知道是否能够成功处理该对象,所以我只想进行peek()操作,而不是删除该对象。只有在成功处理该对象时才想要将其删除。
所以,我需要一个阻塞的peek()函数。但目前peek()根据javadocs仅在队列为空时才返回。
我是否漏掉了什么?是否有其他方法实现这个功能?
编辑:
如果我只使用一个线程安全队列,并进行peek()和sleep()操作,您对此有何想法?
我想编写一个线程,它会一直阻塞到队列中有一个对象为止,就像BlockingQueue.take()函数提供的功能一样。
然而,由于我不知道是否能够成功处理该对象,所以我只想进行peek()操作,而不是删除该对象。只有在成功处理该对象时才想要将其删除。
所以,我需要一个阻塞的peek()函数。但目前peek()根据javadocs仅在队列为空时才返回。
我是否漏掉了什么?是否有其他方法实现这个功能?
编辑:
如果我只使用一个线程安全队列,并进行peek()和sleep()操作,您对此有何想法?
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高效... 欢迎任何评论。