如何在运行方法之外访问HashMap值?

How to access HashMap values outside run method?

提问人:Nour 提问时间:2/8/2022 更新时间:2/12/2022 访问量:153

问:

我的服务器项目中有一个静态内部类。在 run 方法中,我想为每个客户端创建一个对象,其中包含客户端的用户名、套接字和他的 IP 地址。此外,我想将这个对象存储在 HashMap 中。我的问题是,地图中的值只能在 run 方法中访问。我想访问函数内的 Map 值,但函数内的 Map 是空的。mainThreadForPlayerssendMessageToInvitedPlayer

这是我的代码:

public static class mainThreadForPlayers extends Thread {
       DatabaseConnection data = new DatabaseConnection();
       static HashMap<String, Clients> allUsersInfo;
     
       static{
         allUsersInfo = new HashMap<String, Clients>();
       }
       ServerSocket serverSocket;
       boolean accepted = false;
       boolean x = true;
     
       public void run(){
          try{
            
                   serverSocket = new ServerSocket(8000);
            
                   while(x){
                       Socket player1 = serverSocket.accept();
                       InetSocketAddress socketAddress = (InetSocketAddress) player1.getRemoteSocketAddress();
                       String clientIpAddress = socketAddress.getAddress().getHostAddress();
                       try{
                         Thread.sleep(15000);
                       }catch(Exception e){}
                       String username = data.getLastInserted();
                       Clients client = new Clients(username, player1, clientIpAddress);
                       InsertIntoMap(username, client);

                    }
                  
               }
               catch(IOException ex){ex.printStackTrace();}
        }

      public static void InsertIntoMap(String username, Clients client){
           
           if(allUsersInfo.containsKey(username)){
                return;
           }else{
                                
                                allUsersInfo.put(username, client);}
                                for (String name: allUsersInfo.keySet()) {
                                String key = name;
                                String value = allUsersInfo.get(name).toString();
                                System.out.println(key + " " + value);
             }
        
    }

      public void sendMessageToInvitedPlayer(String from_user, String to_user) throws IOException{
 
              if(allUsersInfo.isEmpty()){
                  System.out.println("Hello from server empty");
              }
              else{
                  System.out.println("Hello from server NOT empty");

              }
          
           }  
        
    
}
  

Java 多线程 套接字 hashmap 服务器端

评论

0赞 tquadrat 2/8/2022
找到 的适当范围,或提供用于在实例上插入/读取条目的方法。但是你为什么要使用内部类呢?MapMap
0赞 Nour 2/8/2022
@tquadrat我使用了一个内部类,因为在我的主类中,我管理服务器的 GUI 并扩展了 Application。我尝试创建从 run 方法内部获取 HashMap 值的函数,但似乎没有任何效果,我不知道问题出在哪里

答:

1赞 Gray 2/12/2022 #1

我想将这个对象存储在 HashMap 中。我的问题是,地图中的值只能在 run 方法中访问。我想访问 sendMessageToInvitedPlayer 函数中的 Map 值,但函数中的 Map 是空的。

问题不在于它是一个不同的函数,问题在于它是一个不同的线程。每当您在 2 个线程之间共享信息时,您都需要担心内存同步和锁定。出于性能原因,线程将信息保存在本地内存中,因此在读取和更新 .此外,当您更新(或任何共享对象)时,您需要担心在更新过程中没有获得内存的副本,这可能会导致各种问题。因此,您需要适当的锁定。HashMapMapMap

HashMap不是一个同步的类,因此执行该方法的线程所做的更新不一定会被另一个线程调用 看到。您可以使用 一个可重入类,旨在在多个线程之间共享信息。run()sendMessageToInvitedPlayer(...)ConcurrentHashMap

更一般地说,在线程之间共享信息可能非常复杂,不应轻易完成。这是一个关于在 Java 线程之间共享数据的教程。