服务器程序为什么不退出?

Why does the server program not exit?

我有一个关于 Java RMI 的基本问题,我主要有 C++ 背景,但有些东西我不了解 RMI。

需要说明的是,我能够让它正常工作,但这与程序生命周期有关。

如果我有一个玩具 Java 程序,例如:

public class Test1 {
    public static void main(String args[]) {
        System.out.println( "start !" );
    }
}

当我从 shell 运行 它时,它会打印消息并退出。

如果我想使用套接字,那么我需要在我的服务器中有一些无限循环,它将等待传入的连接,处理它们,然后重新开始。

ServerSocket socketserver = new ServerSocket( port_id );
System.out.println( "server: waiting"  );   

while(true) {
    Socket socket = socketserver.accept(); 
    System.out.println( "server: incoming connection" );
    ... do stuff...
    socket.close();
}

现在,假设我有一个使用以下 main() 方法的 RMI 服务器:

public static void main(String args[]) throws Exception {
    System.out.println( "RMI server started !" );
    MyObject obj = new MyObject();

    Naming.bind( "//localhost/myObject", obj );
    System.out.println( "Done!" );
}

假设可以找到 class MyObject,并且一切都可以正常编译。

如果我 运行 来自 shell,那么虽然它 确实 打印最后一条消息,但 没有无限循环在该行之后,程序不会退出。

问题:

linked question answers the first question, but not the second. Neither does the Oracle tutorial(除非我错过了?)

您应该实现一个线程来侦听客户端连接并创建工作线程来响应客户端。当主线程终止时,加入的线程也将终止。

  1. RMI 为它正在侦听的每个端口创建一个后台非守护线程。该线程只会在其端口上导出的所有对象均已取消导出(显式或通过 DGC)时退出。
  2. 取消导出远程对象,如果您自己在 JVM 中启动它,包括注册表。