Что заставляет сервер RMI продолжать работать? - PullRequest
10 голосов
/ 16 сентября 2011

У меня следующий код RMI-сервера:

public class ServerProgram {
    public ServerProgram() {
        try {
            LocateRegistry.createRegistry(1097);
            Calculator c = new CalculatorImpl();
            String name = "rmi://host:port/name";
            Naming.rebind(name, c);
            System.out.println("Service is bound......");
        } catch (Exception e) {
        }
    }
    public static void main(String[] args) {
        new ServerProgram();
    }
}

Когда вышеприведенная программа работает, она продолжает работать, ожидая клиентских запросов. Но я не понимаю, что заставляет эту программу работать, пока она не находится в состоянии, подобном while(true){};, и как остановить ее прослушивание, кроме остановки всей программы?

Ответы [ 3 ]

5 голосов
/ 17 сентября 2011

Что заставляет его продолжать работать, это поток прослушивания не -демон, запущенный RMI.Чтобы закрыть его, отсоедините имя и отмените экспорт как реестра, так и удаленного объекта с помощью UnicastRemoteObject.unexportObject ().

1 голос
/ 16 сентября 2011

Чтобы остановить это, вы должны позвонить

LocateRegistry.getRegistry().unbind("rmi://host:port/name");
0 голосов
/ 16 сентября 2011

Но я не понимаю, что заставляет эту программу работать, пока она не находится в состоянии, подобном while (true) {};и как остановить его от прослушивания, кроме остановки всей программы?

Это делается edit non - edit daemon thread.См .: Что такое поток Daemon в Java? Вы можете проверить поведение с помощью этого небольшого примера:

public class DaemonThread extends Thread
{
  public void run(){
    System.out.println("Entering run method");
    try
    {
      System.out.println(Thread.currentThread());
      while (true)
      {
        try {Thread.sleep(500);}
        catch (InterruptedException x) {}
        System.out.println("Woke up");
      }
    }
    finally { System.out.println("run finished");}
  }

  public static void main(String[] args) throws InterruptedException{
    System.out.println("Main");
    DaemonThread t = new DaemonThread();
    t.setDaemon(false);  // Set to true for testing
    t.start();
    Thread.sleep(2000);
    System.out.println("Finished");
  }
}

Этот параметр предотвращает отключение JVM.после System.out.println("Finished"); вы все еще видите поток, работающий с "Woke up" выходами журнала.

...