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的效率…任何评论赞赏。

最佳答案
您可以使用LinkedBlockingDeque并从队列中物理删除该项目(使用takeLast()),但如果使用putLast(E e)处理失败,则在队列的末尾再次替换该项目。同时,您的“生产者”将使用putFirst(E e)将元素添加到队列的前端。

您可以随时将此行为封装在您自己的Queue实现中,并提供一个blockingPeek()方法,该方法在底层LinkedBlockingDeque的后台执行takeLast(),后跟putLast()。因此,从呼叫客户端的角度来看,元素永远不会从您的队列中删除。

转载注明原文:java BlockingQueue没有屏蔽偷看? - 代码日志