gpt4 book ai didi

java - 迭代期间从 HashMap 中删除的值

转载 作者:行者123 更新时间:2023-11-30 11:46:11 26 4
gpt4 key购买 nike

我有一个 HashMap,其中包含服务器上分配的地址和客户端名称。当用户注销时,每个人都会收到一条关于他离开的消息,然后我从 HashMap 中移除他。问题是当我迭代 HashMap 以便向所有人发送我使用的消息时一个线程,结果用户在迭代发生之前被删除,因此他没有收到消息。我徒劳地尝试了 Hashtable , ConcurrentHashMap 。当我跳过移除线时,它就起作用了。我怎样才能避免它,我可以使用不同类型的 map 吗?

private HashMap<InetAddress, String> users = new HashMap<InetAddress, String>();

...

 UDPServerSender sender = new UDPServerSender(str, address, true);
sender.start();
users.remove(address);

...

public class UDPServerSender extends Thread {

@Override
public void run() {
iterator = users.keySet().iterator();
while (iterator.hasNext()) {
InetAddress inetaddress = (InetAddress) iterator.next();

我想我可以向已注销的用户发送单独的消息。

最佳答案

听起来线程应该删除地址,而不是主线程。为此,您需要将 HashMap 传递给线程。

另一种方法是在删除地址之前等待线程完成。只需使用 join 等待线程完成:

 UDPServerSender sender = new UDPServerSender(str, address, true);
sender.start();
sender.join();
users.remove(address);

请注意,尽管第二种方法违背了拥有单独线程的目的,因为它破坏了所有并行性(消息现在是一个接一个发送的)。

关于java - 迭代期间从 HashMap 中删除的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945571/

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