我有一个关于 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 也没有(除非我错过了?)
最佳答案
- RMI 为其监听的每个端口创建一个后台非守护线程。仅当显式或通过 DGC 取消导出在其端口上导出的所有对象时,该线程才会退出。
- 取消导出远程对象,包括注册表(如果您自己在 JVM 中启动它)。
关于java - 为什么服务器程序不退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35676355/