今日开发的时候使用jdk自带的运行时变量 RunTime.getRunTime() 去执行bash命令。
因为该bash操作耗时比较长,所以使用了Process.waitFor()去等待子线程运行结束。

这个时候发现程序卡在waitFor()没有继续往下执行。
看了官方解释:

waitFor:等待子进程执行结束,或者已终止子进程,此方法立即返回。
当RunTime对象调用exec方法后,jvm会创建一个子进程,该子进程与jvm建立三个管道连接:标准输入流、标准输出流、标准错误流。假设该子进程不断向标准输入流、标准输出流写数据,而jvm不读取的话,会导致缓冲区塞满而无法继续写数据,最终堵塞在waitFor这里。

知道了问题所在就好处理了, 我们只需要将子进程返回的信息从缓冲区读取出来,便可以避免主线程堵塞问题。

public static void main(String[] args){
Process proc = RunTime.getRunTime().exec("sh /home/winnie/dataExtract.sh") // 标准输入流(必须写在 waitFor 之前)
String inStr = consumeInputStream(proc.getInputStream());
// 标准错误流(必须写在 waitFor 之前)
String errStr = consumeInputStream(proc.getErrorStream()); int retCode = proc.waitFor();
if(retCode == 0){
System.out.println("程序正常执行结束");
}
} /**
* 消费inputstream,并返回
*/
public static String consumeInputStream(InputStream is){
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String s ;
StringBuilder sb = new StringBuilder();
while((s=br.readLine())!=null){
System.out.println(s);
sb.append(s);
}
return sb.toString();
}

  

Process.waitFor()导致主线程堵塞问题的更多相关文章

  1. windows主线程等待子线程退出卡死问题

    在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...

  2. 在主线程中慎用WaitForSingleObject (WaitForMultipleObjects)

    下面的代码我调试了将近一个星期,你能够看出什么地方出了问题吗?线程函数: DWORD WINAPI ThreadProc(    while(!bTerminate)    {        // 从 ...

  3. 2018-10-31-WPF-在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待

    title author date CreateTime categories WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 lindexi 2018-10-31 9:30:9 + ...

  4. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  5. 13、主线程任务太多导致异常退出(The application may be doing too much work on its main thread)

    今天花费了一天的时间来解决这个bug. 这种在程序运行期间出现的问题比较棘手,如果再没有规律的话就更难解决. 还好这个bug是由规律的,也就是说在程序执行半个小时左右后就会因为此异常而导致程序退出:那 ...

  6. Android-优化UI性能(1)-降低主线程的堵塞时间

    Android-优化UI性能(1)-降低主线程的堵塞时间 一 降低主线程的堵塞时间 Android已经提供了AsyncTask实现从主线程生成新的异步任务的方法. 定义并实现以下的类就可以(方法由系统 ...

  7. Delphi主线程重入而导致程序卡死的解决方案

    Delphi的线程可以通过调用AThread.Synchronize(AProc),可以将Proc放入主线程中同步运行,此时AThread将挂起,直到主线程执行完AProc. 如果有BThread,调 ...

  8. FFmpeg在JAVA中的使用以及Process.waitFor()引发的阻塞问题

    此文已由作者叶海啸授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. FFmpeg是一个开源免费跨平台的视频和音频流方案,可以快速对音视频流进行多方面的处理,本文主要介绍FFmp ...

  9. FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时

    由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...

随机推荐

  1. JavaEE之Http协议和Tomcat服务器

    Http协议 什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的         一种网络协议.所有的WWW文件都必须遵守这 ...

  2. 移动端适配(2)——viewport适配

    通过viewport来适配 <script> (function(){ var w=window.screen.width; console.log(w);//获取屏幕尺寸 var tar ...

  3. webstorm启动后右下角总有进程在扫描

    启动webstorm后,右下角有一个扫描的任务总在执行,其他操作很卡. 搜索后找到一个办法:在node-modules右键,选择Mark Directory As选择exclude 具体原因没找到.

  4. 移动端Hybird的网络层优化策略

    一.前端代码策略:域名切换(多域名部署),解决DNS缓存及域名劫持 二.客户端策略 客户端在空闲时ping cdn节点域名列表中的域名,测量延时.丢包等数据.如果延迟 > xxx,丢包 > ...

  5. springmvc封装list个数限制问题

    提交一颗树,三级区域个数大于1000个导致提交失败!!! org.springframework.beans.InvalidPropertyException: Invalid property 'd ...

  6. 第三次Scrum编码冲刺

    1.小组成员 周 斌 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 刘洋江 薛思汝 2.个人在小组第三次冲刺的任务及其完成情况描述. 这次小组活动中我负责测试程序的实现情况,确保程序的每个模块都能正常运行, ...

  7. arcgis 线段合并

    对于上面这种这种有一个字段相同的 线段,使用 使用后生成的矢量如下

  8. Java基础之Map的遍历

    遍历Map集合,有四种方法:   public static void main(String[] args) { Map<String, String> map = new HashMa ...

  9. asp.net ashx导出excel到前台

    最近有一个项目使用以前的ashx,不能使用FileResult,只有通过response返回拼接好的字符串.但是通过查阅资料拼接的字符串总是提示文件格式不匹配,虽然能正常打开,但是体验很不好,在此总结 ...

  10. DevExpress.XtraGrid

    DevExpress.XtraGrid控件使用 该控件类是一个表格控件,但是其具有很多方便而使用的功能,例如可以对记录进行分组,可以再记录的前面加上checkbox,可以将具有相同值的cell 进行合 ...