如何用java运行一个bat并且可以在超时时停止它?

时间:2014-07-01 01:19:45

标签: java batch-file process timeout

我需要一个函数,其参数是bat的文件名,浮点数表示timeOut。我在java中使用了Process来做到这一点。但是如果我想要阻止它,我发现p.destroy()无法停止由bat文件调用的exe文件并仍然运行。所以,我怎么能像#34; Ctrl" +&#一样停止它34; C"在cmd?

public void exec(String path, float timeOutFloat) throws IOException, InterruptedException {
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(new String[] { path });
    ThreadReadExec2 thread = new ThreadReadExec2(p.getInputStream());
    thread.start();
    long timeOut = (long) ((float) timeOutFloat) * 1000;
    long time = 0;
    long onceTime = 100;
    while (thread.isAlive()) {
        Thread.sleep(onceTime);
        time += onceTime;
        if (time > timeOut) {
            p.destroy();
            Thread.sleep(onceTime);
        }
    }
    int res = p.waitFor();
    System.out.println("res:" + res);
}


class ThreadReadExec2 extends Thread {
    InputStream input;
    public ThreadReadExec2(InputStream input) {
        this.input = input;
    }

    @Override
    public void run() {
        BufferedReader ir = new BufferedReader(new InputStreamReader(input));
        try {
            String line;
            while ((line = ir.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
        }
    }
}

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因很可能是因为destroy方法正在杀死您通过批处理文件调用的命令shell,但依次调用该批处理文件的进程。

您基本上需要终止批处理文件的进程树

这个问题中有一些方法提出了在Java中实现这一目标的方法,尽管它有点迂回(链接到看起来最有希望的那个):

https://stackoverflow.com/a/7627648/3583500