必威体育Betway必威体育官网
当前位置:首页 > IT技术

Process对象.waitFor()的阻塞问题(坑)

时间:2019-10-11 09:44:28来源:IT技术作者:seo实验室小编阅读:84次「手机版」
 

waitfor

有时需要在程序中调用可执行程序或脚本命令:

Process process = runtime.getRuntime().exec(shPath);

int exitCode = process .waitFor();

Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示java虚拟机创建一个子进程执行指定的可执行程序,

并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。

它的所有标准io(即stdin,stdout,stderr)操作都将通过三个流(getoutputstream(),getInputStream(),getERRORStream())重定向到父进程。

父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读

写子进程的输出流或输入流出现失败,则可能导致子进程阻塞,甚至产生死锁。(如果程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waifor()这里。)

process .getErrorStream():获得子进程的错误输出流

process .getInputStream():获得子进程的普通输出流

简单示例:

Process shellProcess = null;

try {

shellProcess = Runtime.getRuntime().exec(shPath);

shellErrorResultReader = new BufferedReader(new inputstreamreader(shellProcess.getErrorStream()));

shellInfoResultReader =  new BufferedReader(new InputStreamReader(shellProcess.getInputStream()));

String infoLine;

while ((infoLine = shellInfoResultReader.readLine()) != null) {

logger.info("脚本文件执行信息:{}", infoLine);

}

String errorLine;

while ((errorLine = shellErrorResultReader.readLine()) != null) {

logger.warn("脚本文件执行信息:{}", errorLine);

}

// 等待程序执行结束并输出状态

exitCode = shellProcess.waitfor();

if (0 == exitCode) {

logger.info("脚本文件执行成功:" + exitCode);

} else {

logger.error("脚本文件执行失败:" + exitCode);

}

} catch (Exception e) {

logger.error("shell脚本执行错误", e);

} finally {

if (null != shellInfoResultReader) {

try {

  shellInfoResultReader.close();

} catch (IOException e) {

  logger.error("流文件关闭异常:", e);

}

}

if (null != shellErrorResultReader) {

try {

  shellErrorResultReader.close();

} catch (IOException e) {

  logger.error("流文件关闭异常:", e);

}

}

if (null != shellProcess) {

shellProcess.destroy();

}

}

相关阅读

EOFException 的问题处理

近期工作中, 遇到了有送EOFException的抛出, 以此小节总结学习相关内容, 及如何解决问题。 问题描述 doUnZip(FileOperateUtil.java

Java面试宝典(问题史上最全,总结最好)

说明,为了减轻大家的负担和节省大家的时间,一些过时知识点和被笔试概率极低的题目不再被收录和分析。 回答问题的思路:先正面叙述一

完全背包问题的动态规划解法(普通的思路)

1. 问题描述: 有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值1≤n≤10

关于QQ通讯录的应用及vcf文件导入手机的乱码问题

题记:最近果真是诸事不顺,没钱的日子里手机又丢了,还是比较伤心滴,更伤心地是我那里面有各种日期提醒啊,无限郁闷中。。。最最伤心的是

问题即答案,6个提问启发对方自己找答案

面对他人的提问,一定要直接给出答案才能帮到他吗?事实证明“授人以鱼不如授人以渔”,善用提问才能更好地帮助对方找到答案。今天我想

分享到:

栏目导航

推荐阅读

热门阅读