在通过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的情况下,它可以很好地工作;而使用kill时,进程会启动,但GUI不会出现。
这是两次呼叫之间的优先级问题吗?( runtime.exec的优先级比ProcessBuilder.start低?)。
我已经在运行时exec返回时使用waitFor解决了这个问题,但我很好奇为什么会出现这个问题。
发布于 2012-11-12 22:47:27
基本上,Runtime.exec在OS中异步启动一个新进程,并且不能保证它在您的新进程启动之前完成。理论上,你应该等待taskkill返回一个SUCCESS结果,然后再开始你的新工作。根据它的文档,如果taskkill成功杀死了它的嫌疑人,它将以0返回代码告诉你。
发布于 2012-11-12 23:01:12
该问题与优先级无关,因为它们都具有默认优先级。一个可能的问题是,使用String的Runtime.exec必须解析输入,然后执行命令,而ProcessBuild将在没有所需解析逻辑的情况下执行给定的命令。正因为如此,您可以看到一个很小的延迟,并且您需要waitFor按预期工作。您可以使用Runtime.exec的String[]版本来消除此延迟。还要注意,线程是由系统调度程序调度的,执行顺序是不可预测的,请参见Java thread unpredictable。
https://stackoverflow.com/questions/13345666
复制相似问题