我需要一个函数,其参数是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