gpt4 book ai didi

java - 避免事件总线中的 ConcurrentModificationException

转载 作者:太空宇宙 更新时间:2023-11-04 06:55:23 25 4
gpt4 key购买 nike

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

关于java - 避免事件总线中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com