2016-09-27 98 views
0

我正在编写简单的客户端服务器程序。我遇到的问题如下:我从客户端发送一个对象到服务器,并且我为每个发送到服务器的对象启动新的线程。Java - 从其他线程更改对象属性

我需要从反序列化的对象获取数据并使用此数据更新服务器对象属性。我怎样才能做到这一点?

这是我的服务器代码:

... 

// Property to be updated 
private FieldMap fieldMap = new FieldMap(); 
public void startServer() { 
    try { 
     serverSocket.bind(new InetSocketAddress("localhost", port)); 
     (new Thread(this)).start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void stopServer() { 
    running = false; 
    Thread.currentThread().interrupt(); 
} 

@Override 
public void run() { 
    running = true; 
    while (running) { 
     try { 
      this.setChanged(); 
      this.notifyObservers(); 
      System.out.println("Listening for a connection"); 
      Socket socket = serverSocket.accept(); 
      InputHandler inputHandler = new InputHandler(socket, fieldMap); 
      (new Thread(inputHandler)).start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

... 

这是监听器对象代码:

public class InputHandler implements Runnable { 

    private Socket socket; 
    private ObjectInputStream objectInputStream; 
    private FieldMap map; 

    InputHandler(Socket socket, FieldMap map) throws IOException { 
     this.socket = socket; 
     objectInputStream = new ObjectInputStream(socket.getInputStream()); 
     this.map = map; 
    } 

    @Override 
    public void run() { 
     try { 
      Lemming lemming = (Lemming) objectInputStream.readObject(); 
      lemming.getFieldMap().union(map); 
      map = lemming.getFieldMap(); 
      System.out.println(lemming); 
      (new Thread(lemming)).start(); 
     } catch (IOException | ClassNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       objectInputStream.close(); 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

如何更新从InputHandlerfieldMap

+0

你是什么意思的方法呢? 'InputHandler'已经有了在构造函数中传递给它的'FieldMap'的引用。它可以使用该参考更新地图。你是否问过从几个线程更新'FieldMap'的线程安全问题? – Malt

回答

0

你需要一些像java.uitl.Map

fieldMap.clear() 
fieldMap.putAll(otherFieldMap)