【问题标题】:Java SynchronizersJava 同步器
【发布时间】:2014-11-03 17:49:19
【问题描述】:

场景 - 队列有消息对象。轮询队列并将消息传递给消息处理程序。消息检索(轮询)应在客户端登录事件(一个或多个)时停止。我可以使用等待/通知机制来实现这一点,但 Joshua Bloch 的建议说,随着并发实用程序的出现,几乎没有任何理由使用繁琐的等待/通知机制。我无法选择适合我的目的的同步器(信号量、循环障碍、倒计时)。任何建议表示赞赏。

【问题讨论】:

  • 这确实需要代码。什么样的队列?例如,您可能指的是JMS message queue,,但我认为您不是。
  • @markspace 消息从 JMS 队列中提取,然后放入 LinkedList(用于异步处理)。目前,我提到的队列是 LinkedList。
  • JMS 专为异步消费而设计。为什么不让消息在 JMS 队列中呢?
  • @AlexisHassler JMS 队列上有很多监听器。每条消息都会经过每一个听众。每个侦听器处理每条消息所花费的时间可能会大大增加。引入另一个队列的目的是加快我正在处理的侦听器的响应时间。

标签: java multithreading concurrency synchronous java.util.concurrent


【解决方案1】:

如果不需要立即终止,您可以使用“毒丸”模式。当用户登录时,在队列上放置一个特殊的“终止”对象。当您轮询队列时,检查那个特殊的、唯一的对象。例如

public static final Message POISON_PILL = new Message();

...

in your loop {
   Message message = queue.take();
   if (message == POISON_PILL) // note usage of == here!
      stopTheQueue();
   else
      normalProcessing(message);
}

这意味着队列将处理用户登录之前存在的所有消息。这可能是您想要的。

如果需要立即停止,请检查Thread.interrupted() As described here。这要求登录处理程序知道哪个线程正在处理队列,从而增加耦合。所以“毒丸”很好,因为它的耦合度较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多