【发布时间】:2016-09-27 13:56:47
【问题描述】:
我正在编写简单的客户端-服务器程序。我面临的问题如下:我正在将一个对象从客户端发送到服务器,并为发送到服务器的每个对象启动新线程。
我需要从反序列化的对象中获取数据并使用这些数据更新服务器对象属性。我该怎么做?
这是我的服务器代码:
...
// 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();
}
}
}
}
如何从InputHandler 更新fieldMap?
【问题讨论】:
-
什么意思?
InputHandler已经在构造函数中引用了传递给它的FieldMap。它可以使用该参考更新地图。您是否询问从多个线程更新FieldMap的线程安全方面?
标签: java multithreading network-programming