-1

我正在运行此代码:

Runtime rt = Runtime.getRuntime();
rt.exec("explorer");
rt = null;

代码运行并完成工作,但程序没有终止 - 那是红灯(使用 Eclipse IDE)仍然亮着,这意味着程序没有结束。

可能是什么问题>

4

3 回答 3

4

作为一般规则,将 null 分配给 Java 中的某些内容不会使其停止或消失。充其量,它可能会使任何无法访问的东西......因此在将来的某个时候有资格进行垃圾收集。

如果要停止外部进程,则需要调用destroy()Process对象。这将尝试强制终止外部子进程。它是否会成功将取决于应用程序的权限。(这是否会终止所有子进程的后代取决于平台......)


你是这样评论的:

“销毁结束程序但也杀死exec创建的进程......”

好吧,如果你不想杀死进程,只是想知道发生了什么,那么解释就是“红灯”表示子进程仍在运行。如果您希望“红灯”在不杀死子进程的情况下消失,那么您可能不走运。

我想,另一种可能性是您实际上希望子进程与 Java 应用程序“分离”。我不知道你将如何在 Windows 中执行此操作,但在 Unix/Linux 中你会像这样启动它:

 /bin/bash -c "/usr/bin/nohup /usr/bin/firefox &"

说在&后台运行,并且nohup分离标准输入/输出/错误。

于 2013-06-26T15:03:47.080 回答
1

我很想将对 runtime.exec 的调用移动到单独的 Runnable 对象中。当您创建线程以启动此可运行文件时,请将其设置为守护进程。JVM 应该关闭,但保持守护线程运行。

于 2013-06-26T16:14:38.707 回答
0

因此,来自 Java 的 exec 将启动资源管理器而没有结束......

一种解决方案是简单地告诉 Java 运行一个运行资源管理器的批处理文件。

于 2013-06-27T14:52:08.897 回答