订购Runtime exec和ProcessBuilder.start?

时间:2012-11-12 14:39:47

标签: java process exec runtime.exec

在通过java运行和查杀进程时,我遇到了一个奇怪的问题。

基本上,我有一个使用taskkill杀死一个进程的方法:

private static void kill() {
    try {
      Runtime.getRuntime().exec("taskkill /F /IM app.exe");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我调用此方法以确保在开始新进程之前所有进程都被终止:

    kill();
    ProcessBuilder procBuilder = new ProcessBuilder(args);

    try {
        Process p = procBuilder.start();
    } catch (Exception e) {
        e.printStackTrace();
    }

问题是启动的过程似乎被taskkil杀死了。没有杀人的召唤,它完全没问题;使用kill时,进程启动但GUI不会出现。

这是两个电话之间的优先问题吗? (runtime.exec的优先级低于ProcessBuilder.start?)。

我已经解决了在运行时执行程序返回时使用waitFor,但我很好奇为什么会出现这个问题。

2 个答案:

答案 0 :(得分:2)

基本上Runtime.exec异步启动操作系统中的新进程,并且无法保证在新进程启动之前它已完成。从理论上讲,你应该等待taskkillSUCCESS结果返回并在此之后开始你的新工作。根据其文档taskkill,如果它已成功杀死其嫌疑人,将告诉您0返回代码。

答案 1 :(得分:0)

问题与优先级无关,因为它们都具有默认优先级。可能的问题是使用Runtime.exec的{​​{1}}必须解析输入然后执行命令,而String将执行给定的命令而不需要解析逻辑。因此,您可以看到一个小延迟,您需要ProcessBuild按预期工作。您可以使用waitFor String[]版本来消除此延迟。 另请注意,线程由系统调度程序调度,执行顺序不可预测,请参阅Java thread unpredictable