Можно ли синхронизировать два потока через общий удаленный объект?

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 и меня и игнорировать другие, которые по-разному ошибочны.

Другие вопросы по тегам