在通过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,但我很好奇为什么会出现这个问题。
答案 0 :(得分:2)
基本上Runtime.exec
异步启动操作系统中的新进程,并且无法保证在新进程启动之前它已完成。从理论上讲,你应该等待taskkill
以SUCCESS
结果返回并在此之后开始你的新工作。根据其文档taskkill
,如果它已成功杀死其嫌疑人,将告诉您0返回代码。
答案 1 :(得分:0)
问题与优先级无关,因为它们都具有默认优先级。可能的问题是使用Runtime.exec
的{{1}}必须解析输入然后执行命令,而String
将执行给定的命令而不需要解析逻辑。因此,您可以看到一个小延迟,您需要ProcessBuild
按预期工作。您可以使用waitFor
String[]
版本来消除此延迟。
另请注意,线程由系统调度程序调度,执行顺序不可预测,请参阅Java thread unpredictable。