如何用java运行一个bat,并在超时时停止它



我需要一个函数,其参数是bat的fileName和float表示timeOut。我使用了java中的Process来完成它。但是如果我想停止它,我发现p.b destroy()不能停止由bat文件调用的exe文件,它仍然在运行。那么,我怎么能像在cmd中按Ctrl + C那样停止它呢?

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) {
        }
    }
}

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新