Java 进程执行外部程序造成阻塞的一种原因
2018-10-12 13:51
771 查看
查了好多资料,差点就动手翻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);
}
您可能感兴趣的文章:
相关文章推荐
- 使用linux的cron进程定时执行java程序
- 兼容timeout的Java执行外部命令的小程序
- Java执行外部程序
- Android应用程序中用Java创建本地进程来执行C/C++程序
- JAVA调用外部进程时,进程阻塞问题
- 使用linux的cron进程定时执行java程序
- Java Process Class : Java 执行外部程序及命令
- Centos命令行执行Java程序(引入外部Jar)
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- Java 执行外部程序报1072365564错误问题的解决方法
- java调用外部程序挂起原因
- java调用外部程序执行
- JAVA调用外部程序阻塞问题
- Bat文件执行java命令,报:javac不是内部或外部命令,也不是可运行的程序或批处理文件
- java Runtime Process调用可执行文件,子进程阻塞
- [Java 09 多线程] 线程是指一个进程在执行过程中可以产生更小的程序单元
- [java调用外部可执行程序] 1. java使用cmd命令(转)
- 批处理-----------------杀死进程、开启程序,java执行bat文件
- [java调用外部可执行程序] 2. java输入输出重定向
- Java Process Class : Java 执行外部程序及命令