Qu’est-ce qui fait que le serveur RMI continue à fonctionner?

J’ai le code de serveur RMI suivant:

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

Lorsque le programme ci-dessus est en cours d’exécution, il continue de fonctionner pour attendre les demandes du client. Mais ce que je ne comprends pas, c’est ce qui fait que ce programme continue à fonctionner tant qu’il n’est pas dans quelque chose comme while(true){}; et comment l’empêcher d’écouter, si ce n’est arrêter tout le programme?

Ce qui le rend continuellement en cours d’exécution est un fil d’écoute non- daemon démarré par RMI. Pour le faire sortir, dissociez le nom et annulez l’exportation du registre et de l’object distant, avec UnicastRemoteObject.unexportObject ().

Pour l’arrêter, vous devez appeler

 LocateRegistry.getRegistry().unbind("rmi://host:port/name"); 

Mais ce que je ne comprends pas, c’est ce qui fait que ce programme continue à fonctionner tant qu’il n’est pas dans quelque chose comme while (true) {}; et comment l’empêcher d’écouter, si ce n’est arrêter tout le programme?

Ceci est effectué par un daemon thread édition nondaemon thread . Voir: Qu’est-ce qu’un thread Daemon en Java? Vous pouvez tester le comportement avec ce petit exemple:

 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(Ssortingng[] 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"); } } 

Ce paramètre empêche la JVM de s’éteindre. after System.out.println("Finished"); vous voyez toujours le fil en cours d’exécution avec ses sorties de journal "Woke up" .