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

时间:2016-02-27 22:39:48

标签: java rmi

我有一个关于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,并且所有内容都可以正常编译。

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

问题:

  • RMI API是否实现了一些隐藏的无限循环,那等待传入连接?或者是什么解释?
  • 我如何以编程方式终止服务器?如果我希望它在“x”秒后终止?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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