java Process.waitFor阻塞
关于java Process waitFor() 进程阻塞问题
摘录自:http://lelglin.iteye.com/blog/1487351
问题:有同学遇到java调用Process.exec(),node purppeteer插件去浏览器截图,出现jdk进程未知错误,jstate
M,CSS值居高不下,初步定为waitFor阻塞造成缓存区无法分配。
JDK帮助文档上说:如有必要,一直要等到由该 Process 对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。对此JDK文档上还有如此解释:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。好了,
问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。
接着来分析缓冲区,哪来的这个东西,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。
假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。 知道问题所在,我们解决问题就好办了。查看网上说的方法多数是开两个线程在waitfor()命令之前读出窗口的标准输出缓冲区和标准错误流的内容。代码如下:
1 Runtime rt = Runtime.getRuntime(); 2 String command = "cmd /c ffmpeg -loglevel quiet -i "+srcpath+" -ab "+bitrate+"k -acodec libmp3lame "+desfile; 3 try { 4 p = rt.exec(command ,null,new File("C:\\ffmpeg-git-670229e-win32-static\\bin")); 5 //获取进程的标准输入流 6 final InputStream is1 = p.getInputStream(); 7 //获取进城的错误流 8 final InputStream is2 = p.getErrorStream(); 9 //启动两个线程,一个线程负责读标准输出流,另一个负责读标准错误流
10 new Thread() {
11 public void run() {
12 BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
13 try {
14 String line1 = null;
15 while ((line1 = br1.readLine()) != null) {
16 if (line1 != null){}
17 }
18 } catch (IOException e) {
19 e.printStackTrace();
20 }
21 finally{
22 try {
23 is1.close();
24 } catch (IOException e) {
25 e.printStackTrace();
26 }
27 }
28 }
29 }.start();
30
31 new Thread() {
32 public void run() {
33 BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
34 try {
35 String line2 = null ;
36 while ((line2 = br2.readLine()) != null ) {
37 if (line2 != null){}
38 }
39 } catch (IOException e) {
40 e.printStackTrace();
41 }
42 finally{
43 try {
44 is2.close();
45 } catch (IOException e) {
46 e.printStackTrace();
47 }
48 }
49 }
50 }.start();
51
52 p.waitFor();
53 p.destroy();
54 System.out.println("我想被打印...");
55 } catch (Exception e) {
56 try{
57 p.getErrorStream().close();
58 p.getInputStream().close();
59 p.getOutputStream().close();
60 }
61 catch(Exception ee){}
62 }
63 }
java Process.waitFor阻塞相关推荐
- Java Process.waitFor() 阻塞卡住不返回
1. 现象 在Java程序中,启动另一个进程执行一个命令时可以使用ProcessBuilder类启动一个进程. 以运行 ps 命令为例: ProcessBuilder processBuilder = ...
- Process#waitFor()阻塞问题
有时需要在程序中调用可执行程序或脚本命令: Process process = Runtime.getRuntime().exec(shPath); int exitCode = proce ...
- java process.waitfor();,正确的调用系统命令——为Process.waitFor设置超时以及其他 | 学步园...
Java中在阻塞调用系统命令的时候,一般是使用Runtime.getRuntime().exec(command)返回一个process对象,再调用Process.waitFor()来等待命令执行结束 ...
- java exec waitfor,Java Process waitFor()方法与示例
流程类waitFor()方法在java.lang包中提供了waitFor()方法. waitFor()方法用于使当前正在运行的线程在需要时等待,直到由该Process对象表示的进程完成其终止为止. 当 ...
- Java process.waitFor() 卡死问题
在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本.在Java中提供了两种方法来启动其他程序: (1) 使用Runtime的exec()方法 (2) 使用P ...
- Java Process waitFor()方法与示例
流程类的waitFor()方法 (Process Class waitFor() method) waitFor() method is available in java.lang package. ...
- Java process.waitfor 返回1的原因
Java的Process,在执行命令时,出现waitfor返回1错误.根据java文档,是operation not permited.但绝大多数情况下,这是瞎扯. 真正原因是,你执行的命令(dos或 ...
- java process的waitfor()阻塞问题
http://blog.csdn.net/jimzhai/article/details/7864806 Runtime runtime = Runtime.getRuntime(); Process ...
- Java Process.exitValue Process.waitFor()
http://gohands.blogbus.com/logs/172834178.html Process.exitValue() 采用非阻塞的方式返回,如果没有立即拿到返回值,则抛出异常 Proc ...
最新文章
- Linux后台开发应该具备技能
- poj 2553 The Bottom of a Graph 未完
- Struts2中 Path (getContextPath与basePath)
- SQL查询环比增长 前后行数据对比操作
- Docker 系列之 常用镜像
- 省选专练 [SHOI2001]小狗散步
- LeetCode:Minimum Window Substring
- 《R数据可视化手册》——2.5 绘制箱线图
- 【交通标志识别】基于matlab GUI BP神经网络交通标志识别【含Matlab源码 718期】
- canvas绘制五角星
- CSS calc()函数的用法
- el-upload上传图片,限制上传数量,超过最大数量则不展示上传组件,可点击删除
- 美团2020校招后台开发
- Linux系统接口ioc,Linux下SCSI API研究及应用
- rabbitMQ队列解绑
- 关于pd.read_csv() 读数据的注意事项
- php怎么给文章加页码,PPT如何插入页码
- Python学习笔记之 中英文文本情感分析
- JavaScript变量
- 三相电网的共模与差模