Runtime.exec的奇怪行为

时间:2013-11-21 23:05:56

标签: java eclipse

我使用runtime.exec从我的Java应用程序中启动另一个应用程序。那个子程序没有问题,但是当我调用system.exit(0)时;从父应用程序中,父JVM一直运行,直到子程序终止。

这是一个简单的例子:

    public class Test {

    public static void main(String[] args) {

        try{
             Runtime runtime = Runtime.getRuntime();
             Process p=runtime.exec("cmd /c \"client.exe\"");
             Thread.sleep(10000);
             System.exit(0);
        }
        catch(Exception e){}
    }
}

我希望子应用程序在调用System.exit后继续运行,并让测试应用程序JVM完全关闭。

在eclipse中我得到这种行为:

测试应用程序启动后,client.exe立即启动。在10秒睡眠后,应用程序退出,但是从eclipse控制台退出测试应用程序仍在运行。更奇怪的是,此时点击红色终止按钮什么也没做。然而,只要client.exe关闭,父测试应用程序就会终止。

然而,如果我在eclipse控制台中点击红色终止按钮之前更加奇怪,那么在10秒睡眠过去之前,测试应用程序将关闭并且client.exe继续运行。这是我想要的行为,但我无法弄清楚。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是大多数操作系统的默认行为,即父进程在所有子进程终止之前无法终止。

现在,有一种“时髦”的方式来创建一个“无父”的进程,以便父进程可以终止并且子进程将继续运行,但这会依赖于操作系统,你已经有了...

基本上,命令行变得类似......

cmd /C start /B /NORMAL cmd /c "client.exe"

现在。我建议您使用Runtime#exec(String[])变体,因为这会更好地处理命令中的空格

String[] cmd = {"cmd", "/C", "start", "/B", "/NORMAL", "cmd", "/c", "client.exe"};
runtime.exec(cmd);

通常情况下,我建议ProcessBuilder超过Runtime#exec,因为它允许您更改流程的工作目录......