Можно ли синхронизировать два потока через общий удаленный объект?
public class RMIClient {
public static void main(String[] args) {
String serverURL = "rmi://" + args[0] + "/GameServer";
String viewURL = "rmi://" + args[0] + "/ViewServer";
try {
GameInterface gameIntf = (GameInterface)Naming.lookup(serverURL);
PlayerView view = (PlayerView)Naming.lookup(viewURL);
while(!gameIntf.getGameOver()){
synchronized(GameInterface.sharedObject){
GameInterface.sharedObject.notify();
System.out.println(view.getMessage());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
if(br.readLine().contains("y"))
gameIntf.setNextMove(true);
GameInterface.sharedObject.wait();
}
}
} catch (MalformedURLException | RemoteException | NotBoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public interface GameInterface extends Remote{
public static final Object sharedObject = new Object();
public void setNextMove(boolean val) throws RemoteException;
public boolean getGameOver() throws RemoteException;
}
В настоящее время, когда я запускаю rmiregistry, сервер и запускаю два клиента RMI, оба клиента ждут вечно после получения 1-го ввода, т.е. один клиент не уведомляет другого. Я запускаю клиенты RMI на той же JVM.
1 ответ
Решение
Нет. Объект-заглушка на клиенте не является тем же объектом Java, что и удаленный сервер на хосте сервера, и синхронизация на нем или уведомление о нем не распространяется магическим образом по сети на сервер или на другие клиенты.
Ответы в приведенной вами ссылке также не поддерживают вашу теорию. Вам нужно прочитать ответы @MarcH и меня и игнорировать другие, которые по-разному ошибочны.