注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

Runtime.getRuntime().exec执行阻塞问题解决  

2014-12-02 14:42:35|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Runtime.getRuntime().exec执行阻塞问题解决

分类: Java相关 2010-11-03 19:22 10889人阅读 评论(4) 收藏 举报

nullredirectstringcmdthreados

上篇博文中CallMaxentThreadPoolTask类直接使用Runtime.getRuntime().exec方法调用cmd命令,结果今天在测试时发现当cmd命令执

行出现错误或警告时,主控程序的waitfor方法会被阻塞一直等待下去,查了查资料发现是Runtime.getRuntime().exec方法需要自己处理

stderr 及stdout流,而解决方法即是将它们导出用别的thread处理。

会造成阻塞的代码:

[java] view plaincopyprint?

  1. Process p = Runtime.getRuntime().exec(cmd);?
  2. p.waitFor();?

Process p = Runtime.getRuntime().exec(cmd); p.waitFor();

解决方法:

[java] view plaincopyprint?

  1. Process p = Runtime.getRuntime().exec(cmd);?
  2. StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");?????????????
  3. // kick off stderr
  4. ????? errorGobbler.start();?
  5. ????? StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");?
  6. // kick off stdout
  7. ????? outGobbler.start();??
  8. p.waitFor();?

Process p = Runtime.getRuntime().exec(cmd); StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR"); // kick off stderr errorGobbler.start(); StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT"); // kick off stdout outGobbler.start(); p.waitFor();

其中StreamGobbler类的代码:

[java] view plaincopyprint?

  1. package com.sdc.callmaxent.socket;?
  2. import java.io.BufferedReader;?
  3. import java.io.IOException;?
  4. import java.io.InputStream;?
  5. import java.io.InputStreamReader;?
  6. import java.io.OutputStream;?
  7. import java.io.PrintWriter;?
  8. import com.sdc.callmaxent.util.FileUtil;?
  9. /**
  10. * 用于处理Runtime.getRuntime().exec产生的错误流及输出流
  11. * @author shaojing
  12. *
  13. */
  14. public class StreamGobbler extends Thread {?
  15. ??? InputStream is;?
  16. ??? String type;?
  17. ??? OutputStream os;?
  18. ??? StreamGobbler(InputStream is, String type) {?
  19. this(is, type, null);?
  20. ??? }?
  21. ??? StreamGobbler(InputStream is, String type, OutputStream redirect) {?
  22. this.is = is;?
  23. this.type = type;?
  24. this.os = redirect;?
  25. ??? }?
  26. public void run() {?
  27. ??????? InputStreamReader isr = null;?
  28. ??????? BufferedReader br = null;?
  29. ??????? PrintWriter pw = null;?
  30. try {?
  31. if (os != null)?
  32. ??????????????? pw = new PrintWriter(os);?
  33. ??????????? isr = new InputStreamReader(is);?
  34. ??????????? br = new BufferedReader(isr);?
  35. ??????????? String line=null;?
  36. while ( (line = br.readLine()) != null) {?
  37. if (pw != null)?
  38. ??????????????????? pw.println(line);?
  39. ??????????????? System.out.println(type + ">" + line);?????
  40. ??????????? }?
  41. if (pw != null)?
  42. ??????????????? pw.flush();?
  43. ??????? } catch (IOException ioe) {?
  44. ??????????? ioe.printStackTrace();???
  45. ??????? } finally{?
  46. ??????????? FileUtil.close(pw);?
  47. ??????????? FileUtil.close(br);?
  48. ??????????? FileUtil.close(isr);?
  49. ??????? }?
  50. ??? }?
  51. }??

package com.sdc.callmaxent.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import com.sdc.callmaxent.util.FileUtil; /** * 用于处理Runtime.getRuntime().exec产生的错误流及输出流 * @author shaojing * */ public class StreamGobbler extends Thread { InputStream is; String type; OutputStream os; StreamGobbler(InputStream is, String type) { this(is, type, null); } StreamGobbler(InputStream is, String type, OutputStream redirect) { this.is = is; this.type = type; this.os = redirect; } public void run() { InputStreamReader isr = null; BufferedReader br = null; PrintWriter pw = null; try { if (os != null) pw = new PrintWriter(os); isr = new InputStreamReader(is); br = new BufferedReader(isr); String line=null; while ( (line = br.readLine()) != null) { if (pw != null) pw.println(line); System.out.println(type + ">" + line); } if (pw != null) pw.flush(); } catch (IOException ioe) { ioe.printStackTrace(); } finally{ FileUtil.close(pw); FileUtil.close(br); FileUtil.close(isr); } } }

感谢http://faq.csdn.net/read/200584.html中提到的各位。

  评论这张
 
阅读(447)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017