【问题标题】:is there a blocking queue in Java that only allows peek?Java中是否有一个只允许偷看的阻塞队列?
【发布时间】:2014-04-18 05:01:51
【问题描述】:

我需要一个大小为 1 的阻塞队列,每次应用 put 时,它都会删除最后一个值并添加下一个值。消费者将是一个线程池,其中每个线程都需要在消息被放入队列时读取消息并决定如何处理它,但它们不应该能够从队列中获取,因为它们都需要读取从中。

我在考虑每次生产者发出一条新消息时都只是取放,但是只在消费者的运行方法中窥视会导致他们不断窥视,不是吗?理想情况下,一旦偷看停止,消息就会消失,但我不想使用定时轮询,因为不能保证每个消费者都会及时偷看消息。

目前我的另一个选择是遍历消费者集合并使用消息在它们上调用公共方法,但我真的不想这样做,因为系统依赖于实时更新,并且大量如果我要遍历堆栈上的每个方法调用,集合将需要一段时间才能完全迭代。

【问题讨论】:

  • 你不能继承或装饰一个现有的队列来完成它吗?
  • 要明确一点 - 如果生产者出现并且并非所有消费者线程都已读取单个缓冲区,您希望它阻塞直到拥有,是吗?
  • @MartinJames 是的,希望这不会成为太大的问题,因为消费者都是单独的线程。他们只能读取尾部,但是当添加一定数量的消息时,这可能会导致堆栈溢出
  • 另外,为了清楚一点,如果消息仍然是他们之前收到的消息,消费者将阻塞,即使生产者有下一条消息可用,但由于并非所有客户端都偷看而被阻塞?跨度>
  • @bowmore 是的,一定是这样。消费者将不得不查看队列,将其阻塞,然后将其控制权释放给其他消费者。我可能不得不为消费者实现观察者接口,但这也意味着重写生产者代码

标签: java multithreading blockingqueue


【解决方案1】:

经过一番考虑,我认为你最好,每个消费者都有自己的队列,生产者将其消息放在所有队列中。

  • 如果消费者很少,那么将消息放在这几个队列上不会花费太长时间(除非生产者因为消费者跟不上而阻塞)。
  • 如果有很多消费者,这种情况将比许多消费者相互竞争的情况更可取。

至少这是比较替代解决方案的好方法。

【讨论】:

  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多