java – RMI Server不会使用LocateRegistry.createRegistry方法进行线程化和死亡

前端之家收集整理的这篇文章主要介绍了java – RMI Server不会使用LocateRegistry.createRegistry方法进行线程化和死亡前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我现在使用的是LocateRegistry.createRegistry(1099)而不是在外部进程中使用注册表.但是,在主程序结束后,注册表将会死亡.例如,如果我创建一个创建注册表的简单程序,它将无法工作,因为在main executino之后代码结束.我期待LocateRegistry代码创建一个线程,但似乎并非如此.这是使用LocateRegistry的正常行为还是我遗漏了什么?

代码示例:

// ommited imports

public class RMITest {
    public static void main(String[] args) {
        LocateRegistry.createRegistry(1099);
        // JVM will exit now!!!
    }
}

RMI服务器启动并突然死亡.怎么样

最佳答案

I was expecting the LocateRegistry code to create a thread

@H_403_19@

这不是那么简单.

>导出新端口上的第一个对象会创建一个侦听该端口的线程,并且取消导出侦听端口的最后一个对象会导致该线程退出.这适用于所有远程对象,而不仅仅是本地Registry对象.
>取消导出可以通过本地GC自动发生,而本地GC又可以由远程DGC触发.

您的JVM退出是因为您没有将LocateRegistry.createRegistry()返回的值保存在静态变量中,因此它获取GC,因此对象未被导出,因此端口1099上没有导出远程对象,因此该线程监听1099个出口,因此没有非守护进程线程,因此JVM退出.

解决方案:将LocateRegistry.createRegistry()的结果存储在静态变量中.当您希望JVM退出时,可以使用它来取消导出注册表.

猜你在找的Java相关文章