Значение, удаленное из HashMap во время итерации - PullRequest
2 голосов
/ 30 марта 2012

У меня есть 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 Ответ

1 голос
/ 30 марта 2012

Похоже, что поток должен удалять адрес, а не основной поток. Для этого вам нужно будет передать HashMap в поток.

Еще одна альтернатива - дождаться окончания потока, прежде чем удалять адрес. Просто используйте join, чтобы дождаться завершения потока:

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

Имейте в виду, что этот второй подход лишает цели создания отдельного потока, поскольку он убивает весь параллелизм (теперь сообщения отправляются одно за другим).

...