Runtime.getRuntime().exec 类 防止阻塞


import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.Logger; import org.richinfo.gather.driver.MainEntry; //用两个线程来分别获取标准输出流和错误输出流,否则会造成io阻塞导致程序卡死 public class ShellExec { public static String execute(String cmd) throws IOException, InterruptedException { StringBuffer sb = new StringBuffer(); final Process p = Runtime.getRuntime().exec(cmd); /*为"错误输出流"单独开一个线程读取之,否则会造成标准输出流的阻塞*/ Thread t=new Thread(new InputStreamRunnable(p.getErrorStream(),"ErrorStream")); t.start(); BufferedReader reader = null; InputStream output = p.getInputStream(); //InputStream error = p.getErrorStream(); String line = ""; reader = new BufferedReader(new InputStreamReader(output)); while ((line = reader.readLine())!= null) { sb.append(line + "\n"); } p.waitFor(); // if (0x00 == sb.length()) { // reader = new BufferedReader(new InputStreamReader(error)); // // while ((line = reader.readLine())!= null) { // sb.append(line + "\n"); // } // } reader.close(); p.destroy(); return sb.toString(); } } /**读取InputStream的线程*/ class InputStreamRunnable implements Runnable { BufferedReader bReader=null; String type=null; public InputStreamRunnable(InputStream is, String _type) { try { bReader=new BufferedReader(new InputStreamReader(new BufferedInputStream(is),"UTF-8")); type=_type; } catch(Exception ex) { } } public void run() { String line; int lineNum=0; try { while((line=bReader.readLine())!=null) { lineNum++; //Thread.sleep(200); } bReader.close(); } catch(Exception ex) { } } }

  

转载于:https://www.cnblogs.com/hrx-star/p/6645759.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值