Java 订购运行时exec和ProcessBuilder.start?
在通过java运行和终止进程时,我遇到了一个奇怪的问题 基本上,我有一种使用taskkill杀死一个进程的方法:Java 订购运行时exec和ProcessBuilder.start?,java,process,exec,runtime.exec,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(); } } 我调用此方法以确保在启动新进程之前,所有进程都已终止
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?)
我已经解决了在运行时exec返回时使用waitFor的问题,但我很好奇为什么会出现这个问题。基本上是
运行时。exec
异步启动操作系统中的新进程,并且不能保证它在新进程启动之前完成。理论上,你应该等待taskkill
返回一个SUCCESS
结果,然后才开始你的新工作。根据其文档taskkill
将以0返回码告诉您是否成功杀死了嫌疑犯。该问题与优先级无关,因为两者都具有默认优先级。一个可能的问题是,使用字符串的Runtime.exec
必须解析输入,然后执行命令,而ProcessBuild
将执行给定的命令,而不需要解析逻辑。因此,您可以看到一个小延迟,您需要waitFor
按预期工作。您可以使用Runtime.exec
版本的字符串[]
来消除此延迟。
还请注意,线程由系统调度器调度,执行顺序不可预测,请参阅。“我调用此方法以确保所有进程都已终止”您是否正在尝试创建单实例应用程序?无论你想实现什么,我想这是错误的做法。这个策略就像是“射杀所有移动的东西”。这个策略更像是“射杀所有移动的东西”。。。不管是移动还是不移动…更严重的是,考虑到我不保证启动所有这些进程,并且其中可能有一些死进程,有哪些替代方案?但我认为ProcessBuilder也在这样做thing@LB.是的。无论您使用Runtime.exec
还是ProcessBuilder
都适用相同的规则-您将获得一个Process
对象,您需要从p.getInputStream()
和p.getErrorStream()
中读取任何内容,然后waitFor
流程才能完成。@Ian。明白了,所以没有任何保证,这更像是掷硬币。杀人是在出发后执行的这一事实并不具有代表性,也可能是另一种情况,seamlessly@LB关于延迟的争论,请看我的答案。不,不会的Runtime.exec(String)
使用StringTokenizer
简单地在空白处拆分字符串,并将生成的数组传递给exec(String[])
。如果你想使用cmd
你需要明确地说:exec(新字符串[]{“cmd”,“/c”,commandString})
@Ian这就是我所说的解析。将更新答案,我现在在手机上,更新很痛苦。