首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人机界面节目还没结束吗?

人机界面节目还没结束吗?
EN

Stack Overflow用户
提问于 2012-01-19 11:26:59
回答 2查看 1.1K关注 0票数 2

嗨,我有一个类是一个远程对象,我实现了方法。然后我只想在本地测试一下。所以我在上面增加了一个主要的方法。然后,我主要调用了runtUtilApp方法,它只是执行记事本,睡了一会,我完成了记事本的工作,我调用了停止方法。在所有的执行之后,我等待程序完成执行。但它仍然有效,而且还没有结束。

原因是什么?我想错了?

代码语言:javascript
复制
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.*;



public class ClientImp extends UnicastRemoteObject implements Remote{

    private static final long serialVersionUID = 227L;
    private Process proc;

/**
 * constructor
 */
public ClientImp() throws RemoteException {
    super();
}


public boolean runApp() throws RemoteException {
    try {
        Runtime rt = Runtime.getRuntime();
        proc = rt.exec("notepad");
        return true;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
}


public boolean stopCurrentUtilApp() throws RemoteException {
    proc.destroy();
    return true;
}

public static void main(String[] args) {
     client;
    try {
        ClientImp client = new ClientImp();
        client.runUtilApp();
        Thread.sleep(10000);
        client.stopCurrentUtilApp();
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 11:40:05

因为您的类扩展了UnicastRemoteObject,这意味着当您创建类的新实例时,将调用UnicastRemoteObject构造函数,该构造函数将该对象导出为RMI服务器对象,这将导致启动一个非守护进程RMI线程。

调用System.exit()退出JVM。

票数 2
EN

Stack Overflow用户

发布于 2013-01-15 16:13:17

(我知道这是一个老问题,但由于它被许多其他与RMI相关的问题所引用,所以我想完成/扩展已经给出的答案)

如前所述,JVM没有退出,因为非守护进程RMI线程仍在执行中。当UnicastRemoteObject的构造函数被执行时,这个线程就开始执行。

这个构造函数本身调用静态方法UnicastRemoteObject.exportObject(this, ...),它正在启动RMI线程。

要结束线程,可以调用System.exit()或使用UnicastRemoteObject.unexportObject(everyObjectThatHasBeenExported)取消导出对象。后者的优点是不关闭JVM。

如果您正在构建可重新启动的服务器/网络服务,这是有用的。在这种情况下,不对旧的(不再使用的)对象调用unexportObject会扰乱rmi线程。此外,我假设exportedObject不会被垃圾收集所删除,因为rmi线程仍然持有对它的引用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8925240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档