我的代码是这样的:
Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth"
Process proc = rt.exec(cmd);
现在我想在一秒钟之后终止这个过程,并将他的输出和错误输入到字符串变量中。
怎么做?
在我的情况下: 我在编译类Sth中有一个不定式循环。我开始它然后,一秒后我想杀了它。
//我在Win XP和Debian上测试它。
THX Tzim
答案 0 :(得分:3)
这会有点棘手,因为一旦你终止进程,它的输出就不再可用了,所以你必须在杀掉它之前抓住输出。
Thread.sleep(1000);
InputStream in = proc.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
proc.destroy();
这假设该过程在此期间不会自行关闭。如果是这样,InputStream将无法使用,您希望您一直在阅读数据,而不是歪拇指。
您肯定希望使此异常安全 - 将调用proc.destroy
放在finally处理程序中以确保子进程终止。
答案 1 :(得分:3)
Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth"
Process proc = rt.exec(cmd);
(您的cmd中有拼写错误,您写的是“= Xms2M”而不是“-Xms2M”,“-Xmx16M”也是如此。)
永远不要像这样调用Runtime.exec:你必须在数组中拆分'cmd',否则你会遇到很多问题。这样做:
String[] sar = { "cmd.exe", "/C", "java", "-Xms2M", "-Xmx16M", "Sth" };
Runtime.getRuntime().exec( sar );
答案 2 :(得分:1)
您可以使用ProcessBuilder返回Process对象并使用它的destroy()方法。
答案 3 :(得分:1)
这也可以帮助你:
private static String runCommand(boolean debug, String... script) throws IOException, InterruptedException {
Runtime rt = Runtime.getRuntime();
Process process = rt.exec(script);
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StreamReaderUtil.UTF8));
Thread.sleep(1000);
StringBuilder queryExe = new StringBuilder();
try {
String str;
while(reader.ready() && (str = reader.readLine()) != null) {
queryExe.append(str).append("\n");
}
} catch(IllegalThreadStateException e) {
Thread.sleep(250);
}
// FIXME: Replace with a Logger
if(debug) {
System.out.println("Executing : " + script);
System.out.println("Result : " + queryExe);
}
return queryExe.toString();
} finally {
if(process != null) {
process.destroy();
}
if(reader != null) {
reader.close();
}
}
}