java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决 - 勇敢清晨

tyydevelop 2021-08-07 原文


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脚本执行完成

发表于
2017-11-02 11:50 
勇敢清晨 
阅读(13653
评论(0
编辑 
收藏 
举报

 

版权声明:本文为tyydevelop原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tyydevelop/p/7771503.html

java中Runtime.getRuntime().exec()的坑,会造成阻塞的解决 - 勇敢清晨的更多相关文章

  1. 105 – kube-scheduler源码分析 – predicate算法注册

    一、predicate注册过程  今天我们来聊聊predicate函数是怎么被注册进去的,也就是要执行的一堆p […]...

  2. 新能源汽车 – 电池技术介绍

    背景 据Elelectrek,特斯拉正在加速自产电池研发,已经收购了一家位于加拿大的电池制造公司“Hibar […]...

  3. 阿里云短信验证_基于阿里云OpenAPI实现 – Fench

    阿里云短信验证_基于阿里云OpenAPI实现 阿里云短信验证服务 阿里云短信服务 背景简介: 短信验证以及短信 […]...

  4. pytest系列(六) – app 自动化测试 – 多设备并发 -appium+pytest+ 多线程

    1、appium+python 实现单设备的 app 自动化测试 启动 appium server,占用端口 […]...

  5. bootstrap里的图标 – 欲生

    bootstrap里的图标 bootstrap里的图标全部位于fonts, 如果你使用图标是为了表达某些含义( […]...

  6. Solr部署如何启动 – 神奇的旋风

    Solr部署如何启动 我刚接触solr,我要怎么启动,这是群里的朋友问得比较多的问题, solr最新版本下载地 […]...

  7. eclipse下无法加载主类的错误 – 提子呀呀

    eclipse下无法加载主类的错误   用eclipse写java程序的时候,时常会发生无法加载主类的情况,搜 […]...

  8. 《吊打面试官》系列-ConcurrentHashMap & HashTable

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/J […]...

随机推荐

  1. JAVA 8学习笔记-第三章

    CHAPTER 3  CORE JAVA APIs API: Application Programming […]...

  2. 线程实现模型

    线程实现模型 线程实现模型主要分为:用户级线程模型,内核级线程模型和两级线程模型。他们的区别在于线程与内核线程 […]...

  3. 内核驱动中常见的miscdevice、platform_device、platform_driver

    最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解。后来因为想在驱 […]...

  4. USB加minicom使用串口

    窘况描述: 1.PC上没有串口,并且主板上也没有预留增加串口的插孔 2.虽然买了根USB转串口线,但是天嵌没有 […]...

  5. Asp.net Core +MVC+Bootstrap开发项目实站2

    既然是项目那项目所用的就一定要有前台和后台   前台网上一大把Bootstrap  angular  ..等等 […]...

  6. 按钮自动点击,间隔10s点击一次

    想要页面自动点击 <a href="#" id="clickMe" onclick="alert(\'c […]...

  7. 如何评估工作量–三点估算

    如何评估工作量–三点估算 如何科学的评估项目工期。 认为正常情况下完成项目需要42 天,同时也分析 […]...

  8. 如何用代码实现iPhone手机软件注销和手机重启

    注销和重启都分别用命令就行 软件注销:system(“killall SpringBoard […]...

展开目录

目录导航