我有一个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();
我想我可以向已签约的用户发送单独的消息。
答案 0 :(得分:1)
听起来线程应该删除地址,而不是主线程。为此,您需要将HashMap
传递给主题。
另一种方法是在删除地址之前等待线程完成。只需使用join
等待线程完成:
UDPServerSender sender = new UDPServerSender(str, address, true);
sender.start();
sender.join();
users.remove(address);
请注意,第二种方法无法实现单独的线程,因为它会杀死所有并行性(消息现在逐个发送)。