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();
}
}
}
}
InputHandler
からfieldMap
を更新する方法は?
のようにいくつかの方法がありますか? 'InputHandler'は既にコンストラクタで渡された' FieldMap'への参照を持っています。その参照を使用して地図を更新するだけです。いくつかのスレッドから 'FieldMap'を更新するスレッドの安全性について質問していますか? – Malt