Java 进程执行外部程序,造成外部程序阻塞的一种原因
程序员文章站
2022-05-18 13:11:16
...
前一阵子在研究文档展示时使用了java进程直接调用外部程序。
其中遇到一个问题花了好长时间才解决。
这个问题就是外部程序直接执行没什么问题,但是当使用Java进程执行时外部程序就阻塞在那儿不动了。而且这个外部程序在处理某些文件时使用Java进程执行是没问题的
查了好多资料,差点就动手翻Java源码了,最后结合一篇文章(忘记出处了),想到了输出流会阻塞进程执行。
Java进程执行有一个输入流,两个输出流(相对于外部程序)。当两个输出流有内容输出,而Java执行程序没有及时清空输出流时就会阻塞进程。
现贴出代码,希望能帮助到有需要的同行:
其中遇到一个问题花了好长时间才解决。
这个问题就是外部程序直接执行没什么问题,但是当使用Java进程执行时外部程序就阻塞在那儿不动了。而且这个外部程序在处理某些文件时使用Java进程执行是没问题的
查了好多资料,差点就动手翻Java源码了,最后结合一篇文章(忘记出处了),想到了输出流会阻塞进程执行。
Java进程执行有一个输入流,两个输出流(相对于外部程序)。当两个输出流有内容输出,而Java执行程序没有及时清空输出流时就会阻塞进程。
现贴出代码,希望能帮助到有需要的同行:
/** * pdf转swf函数 * @param path 输入输出文件路径 * @param inputFileName 输入文件名 * @param outputFileName 输出文件名 * @return File 生成的swf文件 */ private static File toSwf(String sourceFile, String destFile, String command) { long beginTime = System.nanoTime(); Runtime rt = Runtime.getRuntime(); try { Process process = rt.exec(command); final InputStream isNormal = process.getInputStream(); new Thread(new Runnable() { public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(isNormal)); StringBuilder buf = new StringBuilder(); String line = null; try { while((line = br.readLine()) != null){ buf.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } System.out.println("输出结果为:" + buf); } }).start(); // 启动单独的线程来清空process.getInputStream()的缓冲区 InputStream isError = process.getErrorStream(); BufferedReader br2 = new BufferedReader(new InputStreamReader(isError)); StringBuilder buf = new StringBuilder(); String line = null; while((line = br2.readLine()) != null){ buf.append(line + "\n"); } System.out.println("错误输出结果为:" + buf); try { process.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } long endTime = System.nanoTime(); System.out.println("转swf耗时: " + (endTime - beginTime) / 1000000000 + " 秒 " + sourceFile); return new File(destFile); }