我有许多并发客户端——即线程同时运行和做某事。每个客户端都实现了某个事件总线的侦听器。来自该总线的消息可以到达一个或多个客户端。我的任务是将该消息广播给所有客户。
这个任务看起来很简单,但我找不到在某种程度上不难看的解决方案。
(1) 直截了当的解决方案:
void onMessageArrived(Message message) {
broadcast(message);
}
- 不好,因为每条消息都会被广播多次,因为多个客户端可以接收该消息,因此可以运行多个 onMessageArrived 处理程序。
(2) 我们可以将广播的消息存储在某个列表中:
void onMessageArrived(Message message) {
if (alreadyBroadcastedConcurrentMap.putIfAbsent(message)==null) {
broadcast(message);
}
}
- 这解决了前面提到的问题,但是许多客户端会重复将已经存在的消息放入该列表的无用操作。
但是可能有更好的选择吗?
爪哇。