迭代期间从HashMap中删除的值

时间:2012-03-30 15:04:32

标签: java hashmap iteration

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

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();

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

1 个答案:

答案 0 :(得分:1)

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

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

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

请注意,第二种方法无法实现单独的线程,因为它会杀死所有并行性(消息现在逐个发送)。