Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 订购运行时exec和ProcessBuilder.start?_Java_Process_Exec_Runtime.exec - Fatal编程技术网

Java 订购运行时exec和ProcessBuilder.start?

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(); } } 我调用此方法以确保在启动新进程之前,所有进程都已终止

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


我已经解决了在运行时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这就是我所说的解析。将更新答案,我现在在手机上,更新很痛苦。