我需要一个函数,其参数是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) {
}
}
}
答案 0 :(得分:0)
发生这种情况的原因很可能是因为destroy
方法正在杀死您通过批处理文件调用的命令shell,但不依次调用该批处理文件的进程。
您基本上需要终止批处理文件的进程树。
这个问题中有一些方法提出了在Java中实现这一目标的方法,尽管它有点迂回(链接到看起来最有希望的那个):