可执行jar包调用exe可执行文件,子进程堵塞

时间:2022-12-25 09:14:22

背景:

需要在项目的测试工具中添加一个按钮,点击后直接打开某exe工具。

这个工具的功能是导入txt文件,转为excel报表输出。

无奈解析了两行之后就停止不动了,也不报错。关闭测试工具后,就很顺畅的继续运行。

原因:

txt转excel报表过程中,中间信息是存在内存中的,缓存区的空间被占满后,程序就被阻塞了,一直在等待缓存区空间资源的释放,所以需要建立线程及时清空缓存区。

解决办法:

1.创建StreamClean线程类

/*
* 建立线程及时清除阻塞区,避免子线程阻塞(调用外部工具txt->excel时发生的问题。)
*/
public class StreamClean extends Thread {

InputStream is;
String type;

public StreamClean (InputStream is, String type) {
this.is = is;
this.type = type;
}

public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null){
System.out.println(type + ">" + line); //控制台输出
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}

2.在调用exe执行文件处添加下列代码

      Process process = null; 
try {
process =Runtime.getRuntime().exec(txtToexcel); //txtToexcel是调用工具的dos命令
new StreamClean(process.getInputStream(), "INFO").start();
new StreamClean(process.getErrorStream(), "ERROR").start();
process.waitFor();
}catch (Throwable t) {
t.getStackTrace();
} finally {
if (process != null){
process.destroy();
}
process = null;
}

再执行就木有问题啦~~~