没有消费者准备好时处理生产者线程

时间:2011-10-16 19:30:07

标签: java multithreading concurrency producer-consumer

有关处理以下方案的模式的建议:

将事件分派给消费者的单个线程。每个事件与消费者之间存在1:1(根据事件/消费者ID匹配将每个事件分派给单个消费者)。

消费者以不同的速度处理事件,并且可以使用可配置的批量大小消耗事件(例如,消费者一次可以消耗20个事件)。

生产者线程应始终能够将事件分派给能够使用的消费者。每个使用者维护一个已消耗的事件队列(可能是批处理的)并在其自己的线程上处理这些事件,因此从生产者到消费者的切换是异步的。

如果没有消费者可以在任何时间点消费,那么调度线程会发生什么?

  • yield()
  • wait()&强迫消费者致电notify()
  • sleep()一段固定时间

任何理由更喜欢一个而不是另一个?

一些专业人士缺点:

  • 产量很简单
  • 强迫消费者致电通知增加复杂性
  • 在一段固定时间内睡觉适合非时间敏感的要求
  • 旋转会占用CPU,除非我们需要尽可能快的事件传递,否则不必要。

还有其他考虑吗?

3 个答案:

答案 0 :(得分:4)

您应该考虑的另一种方法是将其写入BlockingQueue。让队列管理在没有监听器的情况下发送的请求。

更好:写一个Broker拥有BlockingQueue并保持List Consumers。当Broker发送新的List时,让Consumers通知Producer Event

自JDK 1.0开始,我将使用Java Bean中内置的PropertyChangeListenerEventObject在内存中执行此操作。

答案 1 :(得分:1)

a)你可以选择yield但是根据环境的好坏,这可能基本上变成了无操作。因此,这基本上与旋转具有相同的结果。

b)睡眠是一个简单的选择,但是你应该想出睡多久。执行sleep(0)也无济于事,因为它与执行(a)

相同

通知的力量更复杂,但您可以完全控制流量。

答案 2 :(得分:0)

看看JMS。 JMS旨在处理这种用例。

在您的方案中,全面的JMS安装可能过度 - 您没有提供足够的信息。