我有一个关于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!" );
}


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

如果我从外壳程序运行此命令,则尽管它确实打印了最后一条消息并且在该行之后没有无限循环,但程序不会退出。

问题:


RMI API是否实现一些隐藏的无限循环,即等待传入连接?否则解释是什么?
如何以编程方式终止服务器?说是否要在“ x”秒后终止?


linked question回答第一个问题,但不回答第二个问题。 Oracle tutorial也不(除非我错过了?)

最佳答案

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

10-06 14:05
查看更多