[英]java killing process after a period of time
我的代码是这样的:
Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth"
Process proc = rt.exec(cmd);
现在,我想在一秒钟后终止此过程,并将其输出和错误转换为字符串变量。
怎么做 ?
就我而言:我在编译类Sth中有一个不定式循环。 我正在启动它,然后一秒钟后我想杀死它。
//我正在Win XP,然后是Debian上对其进行测试。
蒂兹
这将有点棘手,因为一旦终止该进程,其输出将不再可用,因此您必须在终止它之前先获取该输出。
Thread.sleep(1000);
InputStream in = proc.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
proc.destroy();
这是假设该过程在此期间不会自行关闭。 如果是这样,InputStream将无法使用,并且您希望自己一直在读取数据,而不是不停地摇晃手指。
您一定要使此异常安全- proc.destroy
的调用放在一个finally处理程序中,以确保终止子进程。
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 );
这也可以帮助您:
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();
}
}
}
您可以使用ProcessBuilder返回一个Process对象,并使用它的destroy()方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.