提问人:Nour 提问时间:2/8/2022 更新时间:2/12/2022 访问量:153
如何在运行方法之外访问HashMap值?
How to access HashMap values outside run method?
问:
我的服务器项目中有一个静态内部类。在 run 方法中,我想为每个客户端创建一个对象,其中包含客户端的用户名、套接字和他的 IP 地址。此外,我想将这个对象存储在 HashMap 中。我的问题是,地图中的值只能在 run 方法中访问。我想访问函数内的 Map 值,但函数内的 Map 是空的。mainThreadForPlayers
sendMessageToInvitedPlayer
这是我的代码:
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");
}
}
}
答:
1赞
Gray
2/12/2022
#1
我想将这个对象存储在 HashMap 中。我的问题是,地图中的值只能在 run 方法中访问。我想访问 sendMessageToInvitedPlayer 函数中的 Map 值,但函数中的 Map 是空的。
问题不在于它是一个不同的函数,问题在于它是一个不同的线程。每当您在 2 个线程之间共享信息时,您都需要担心内存同步和锁定。出于性能原因,线程将信息保存在本地内存中,因此在读取和更新 .此外,当您更新(或任何共享对象)时,您需要担心在更新过程中没有获得内存的副本,这可能会导致各种问题。因此,您需要适当的锁定。HashMap
Map
Map
HashMap
不是一个同步的类,因此执行该方法的线程所做的更新不一定会被另一个线程调用 看到。您可以使用 一个可重入类,旨在在多个线程之间共享信息。run()
sendMessageToInvitedPlayer(...)
ConcurrentHashMap
更一般地说,在线程之间共享信息可能非常复杂,不应轻易完成。这是一个关于在 Java 线程之间共享数据的教程。
评论
Map
Map