Java同步器

时间:2014-11-03 17:49:20

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

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

1 个答案:

答案 0 :(得分:1)

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

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);
}

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

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