我正在运行此代码:
Runtime rt = Runtime.getRuntime();
rt.exec("explorer");
rt = null;
代码运行并完成工作,但程序没有终止 - 这是红灯(使用Eclipse IDE)仍然意味着程序没有结束。
可能是什么问题>
答案 0 :(得分:4)
作为一般规则,在Java中为null分配null不会使其停止或消失。充其量,可以制作任何无法访问的内容......因此有资格在将来的某个时间点进行垃圾收集。
如果要停止外部流程,则需要在Process
对象上调用destroy()
。这将尝试强制终止外部子进程。它是否会成功取决于应用程序的权限。 (这是否会终止所有子进程后代取决于平台...)
您评论如此:
“销毁结束程序,但也杀死了exec创建的进程......”
好吧,如果你不想杀死这个过程,只是想知道发生了什么,那么解释是“红灯”意味着子进程仍然是运行。如果你希望“红灯”能够在不杀死儿童过程的情况下消失,你可能会失去运气。
我想,另一种可能性是您实际上希望子进程从Java应用程序“分离”。我不知道你将如何在Windows中执行此操作,但在Unix / Linux中你会像这样启动它:
/bin/bash -c "/usr/bin/nohup /usr/bin/firefox &"
&
表示在后台运行,nohup
分离标准输入/输出/错误。
答案 1 :(得分:1)
我很想将对runtime.exec的调用转移到一个单独的Runnable对象中。创建Thread以启动此runnable时,将其设置为守护程序。 JVM应该关闭,但让守护程序线程继续运行。
答案 2 :(得分:0)
因此,来自Java的exec将启动探索器而不会结束......
一个解决方案就是告诉Java运行运行资源管理器的批处理文件。