我有一个 EventBus
系统,客户端可以随意加入/离开。
EventBus
使用 HashSet
来跟踪客户端,当消息被广播时,它会被传递到所有注册的客户端。
// clients - HashSet of clients.
// message - event object to be delivered
for (Object client : clients) {
sendTo(client, message);
}
我知道这效率低下,但我不知道如何改进。
问题是客户端可以通过断开与总线的连接来对某些事件使用react。就当事实吧,这一定是可能的。
他们调用这个方法:
public void unsubscribe(Object client)
{
clients.remove(client);
}
然后,当然,我收到一个错误:
[!E!] java.util.ConcurrentModificationException
[!E!] at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:390)
[!E!] at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:401)
[!E!] at mightypork.utils.control.bus.EventChannel.doBroadcast(EventChannel.java:56)
[!E!] at mightypork.utils.control.bus.EventChannel.broadcast(EventChannel.java:48)
[!E!] at mightypork.utils.control.bus.EventBus.broadcast(EventBus.java:82)
[!E!] at mightypork.rogue.App.shutdown(App.java:133)
[!E!] at mightypork.rogue.App.start(App.java:87)
[!E!] at mightypork.rogue.App.main(App.java:72)
[!E!]
不太酷,对吧?
有办法解决这个问题吗?
请您参考如下方法:
您可以使用 LinkedList为此。
对于 LinkedList,您可以使用其迭代器循环遍历它,并使用同一迭代器从 LinkedList 中删除对象。
示例:
List<Client> clients = new LinkedList<>();
Iterator it = clients.iterator();
while (it.hasNext())
{
Client client = (Client) it.next();
sendTo(client, message);
it.remove();
}