【问题标题】:Why does JVM does not terminate when using RMI为什么JVM在使用RMI时不终止
【发布时间】:2010-01-16 18:36:49
【问题描述】:

我刚刚在 http://java.sun.com/docs/books/tutorial/rmi/implementing.htmlhttp://java.sun.com/docs/books/tutorial/rmi/implementing.html 上阅读了关于 RMI 的 Trail。

当我运行该示例时,尽管 main 已完成,但 JVM 并未终止。 RMI 是否在内部某处产生线程?

main 退出后,main 中产生的多个线程的行为是什么? 让线程随时退出是一种干净的方法,还是应该在生成的每个线程上进行连接?我没有找到关于这个问题的任何文档。

非常感谢您的帮助!!

public class ComputeEngine implements Compute {

    public ComputeEngine() {
        super();
    }

    public <T> T executeTask(Task<T> t) {
        return t.execute();
    }


    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Compute";
            Compute engine = new ComputeEngine();
            Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.rebind(name, stub);
            System.out.println("ComputeEngine bound");
        } catch (Exception e) {
            System.err.println("ComputeEngine exception:");
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 非常感谢您的有用回答!

标签: java multithreading rmi


【解决方案1】:

创建一个线程来监听套接字并回复对您的对象的请求。停止 JVM 的一种方法是取消绑定服务器:

Registry.unbind() 

并取消导出对象:

UnicastRemoteObject.unexportObject()). 

【讨论】:

  • 感谢您的回答!这是一种干净的方式吗?主线程不应该等待退出所有线程吗? (上面的第二个问题)
  • 好吧,唯一的问题是“你想什么时候停止你的应用程序?”。例如,您可以在收到特定消息时决定取消导出和解除绑定。
【解决方案2】:

您可以使用 JDK 中包含的 jstack 实用程序来查看 Java 程序中正在运行的线程,甚至这些线程在哪一行。

因此,如果您的程序仍在运行,您只需在 pid 上运行 jstack,它会告诉您哪些线程仍在运行以及它们在做什么。

【讨论】:

    【解决方案3】:

    关于您问题的“多线程行为”部分:是的,JVM 将继续运行,直到所有线程完成。唯一的例外是标记为守护进程的线程(参见 Thread.setDaemon()),JVM 不会等待它们。

    【讨论】:

      【解决方案4】:

      是的,当您通过 RMI 公开对象时,它需要一个线程来接受对这些对象的传入请求。这个线程可能是一个守护线程,它不会阻止 JVM 退出,但它不是有几个原因,只要仍然有活动的导出对象,它就会阻碍 JVM 正常退出。因此,您可以对所有对象使用 unexportObject,或者只使用 System.exit() 来结束 JVM,尽管这会使客户端不知道关闭的情况。

      【讨论】:

        猜你喜欢
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        相关资源
        最近更新 更多