首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >订购运行时exec和ProcessBuilder.start?

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

Stack Overflow用户
提问于 2012-11-12 22:39:47
回答 2查看 1K关注 0票数 1

在通过java运行和终止进程时,我遇到了一个奇怪的问题。

基本上,我有一个使用taskkill杀死一个进程的方法:

代码语言:javascript
复制
private static void kill() {
    try {
      Runtime.getRuntime().exec("taskkill /F /IM app.exe");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我调用这个方法来确保在我开始一个新的进程之前所有的进程都被终止了:

代码语言:javascript
复制
    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解决了这个问题,但我很好奇为什么会出现这个问题。

EN

回答 2

Stack Overflow用户

发布于 2012-11-12 22:47:27

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-12 23:01:12

该问题与优先级无关,因为它们都具有默认优先级。一个可能的问题是,使用StringRuntime.exec必须解析输入,然后执行命令,而ProcessBuild将在没有所需解析逻辑的情况下执行给定的命令。正因为如此,您可以看到一个很小的延迟,并且您需要waitFor按预期工作。您可以使用Runtime.execString[]版本来消除此延迟。还要注意,线程是由系统调度程序调度的,执行顺序是不可预测的,请参见Java thread unpredictable

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13345666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档