嗨,我有一个类是一个远程对象,我实现了方法。然后我只想在本地测试一下。所以我在上面增加了一个主要的方法。然后,我主要调用了runtUtilApp方法,它只是执行记事本,睡了一会,我完成了记事本的工作,我调用了停止方法。在所有的执行之后,我等待程序完成执行。但它仍然有效,而且还没有结束。
原因是什么?我想错了?
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();
}
}}
发布于 2012-01-19 11:40:05
因为您的类扩展了UnicastRemoteObject,这意味着当您创建类的新实例时,将调用UnicastRemoteObject构造函数,该构造函数将该对象导出为RMI服务器对象,这将导致启动一个非守护进程RMI线程。
调用System.exit()退出JVM。
发布于 2013-01-15 16:13:17
(我知道这是一个老问题,但由于它被许多其他与RMI相关的问题所引用,所以我想完成/扩展已经给出的答案)
如前所述,JVM没有退出,因为非守护进程RMI线程仍在执行中。当UnicastRemoteObject的构造函数被执行时,这个线程就开始执行。
这个构造函数本身调用静态方法UnicastRemoteObject.exportObject(this, ...),它正在启动RMI线程。
要结束线程,可以调用System.exit()或使用UnicastRemoteObject.unexportObject(everyObjectThatHasBeenExported)取消导出对象。后者的优点是不关闭JVM。
如果您正在构建可重新启动的服务器/网络服务,这是有用的。在这种情况下,不对旧的(不再使用的)对象调用unexportObject会扰乱rmi线程。此外,我假设exportedObject不会被垃圾收集所删除,因为rmi线程仍然持有对它的引用。
https://stackoverflow.com/questions/8925240
复制相似问题