java BlockingQueue 没有阻塞窥视?

标签 java queue peek blockingqueue

我有一个阻塞的对象队列。

我想写一个线程阻塞直到队列中有一个对象。类似于 BlockingQueue.take() 提供的功能。

但是,由于我不知道我是否能够成功处理该对象,所以我只想 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 高效...任何评论表示赞赏。

最佳答案

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

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

关于java BlockingQueue 没有阻塞窥视?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1759803/

相关文章:

java - 相互传递多个对象

java - 如何在Java中克隆BlockingQueue?

c - 查看输入缓冲区,并清除 C 中的额外字符

ios - 快速 3D Peek 和 POP

java - 是否可以将所有必需的库打包到一个 Jar 中(在主 jar 之外)?

java - 获取 java.sql.SQLException : Operation not allowed after ResultSet closed

Java:Arrays.sort 快速排序和归并排序

python - Python中的有效队列/链表

c - 使用队列进行基数排序

go - 从 golang 中的缓冲读取器读取特定数量的字节