场景 - 队列具有消息对象。轮询队列并将消息传递给消息处理程序。应在客户端登录事件(一个或多个)上暂停消息检索(轮询)。我可以使用等待/通知机制来实现这一点,但是Joshua Bloch的建议说,随着并发实用程序的出现,几乎没有理由使用繁琐的等待/通知机制。我无法选择哪个同步器(信号量,循环障碍,倒计时)适合我的目的。任何建议表示赞赏。
答案 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,从而增加了耦合。所以“毒丸”很好,因为它的耦合较少。