1

在通过 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 ?)。

我已经解决了在 Runtime exec 返回时使用 waitFor 的问题,但我很好奇为什么会出现这个问题。

4

2 回答 2

2

基本上,Runtime.exec在操作系统中异步启动一个新进程,并且不能保证它在你的新进程启动之前完成。从理论上讲,您应该等待结果taskkill返回,SUCCESS然后才开始您的新工作。根据它的文档taskkill,如果它成功杀死了它的嫌疑人,它会用 0 返回代码告诉你。

于 2012-11-12T14:47:26.647 回答
0

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

于 2012-11-12T15:01:11.640 回答