我有一个 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(); 
} 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!