java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决
Posted 勇敢清晨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决相关的知识,希望对你有一定的参考价值。
synchronized (this) {
process = Runtime.getRuntime().exec(cmds);
}
//记录进程缓存错误信息
final StringBuffer errorLog = new StringBuffer();
//获取执行进程的错误流
final InputStream errorStream = process.getErrorStream();
final InputStream inputStream = process.getInputStream();
//处理InputStream的线程
new Thread() {
public void run() {
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
try {
while ((line = in.readLine()) != null && !errorLog.toString().contains("ERROR")) {
if (line != null) {
errorLog.append(line);
}
}
} catch (IOException e) {
throw new RuntimeException("[shell exec error]:" + errorLog, e);
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
//处理errorStream的线程
new Thread() {
@Override
public void run() {
BufferedReader err = new BufferedReader(new InputStreamReader(errorStream));
String line = null;
try {
while ((line = err.readLine()) != null && !errorLog.toString().contains("ERROR")) {
if (line != null) {
errorLog.append(line);
}
}
} catch (IOException e) {
throw new RuntimeException("[shell exec error]:" + errorLog, e);
} finally {
try {
errorStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
logger.info("等待shell脚本执行完成");
Thread.sleep(1000);
//异常终止
if (errorLog != null && errorLog.length() > 0 && errorLog.toString().contains("ERROR")) {
dispatchLogger.error("[shell exec error]:" + errorLog);
throw new RuntimeException("[shell exec error]:" + errorLog);
}
process.waitFor(); //等待shell脚本执行完成
以上是关于java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Java 进程(Runtime.getRuntime().exec() 或 ProcessBuilder)读取 InputStream
RunTime.getRuntime().exec()运行脚本命令介绍和阻塞
Runtime.getRuntime.exec()执行java进程失败
当我执行多个优于 Runtime.getRuntime().availableProcessors()) 的并行线程时,为啥我的 Java 程序运行得更快?