码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-10-21 17:50:14      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:java   线程阻塞   内存   thread   

背景:

需要在项目的测试工具中添加一个按钮,点击后直接打开某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; 
	    }
		

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


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

标签:java   线程阻塞   内存   thread   

原文地址:http://blog.csdn.net/hello_yz/article/details/40345839

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!