java执行bat命令碰到的阻塞问题
来源:互联网 发布:java管理系统实战 编辑:程序博客网 时间:2024/06/04 18:20
使用Java来执行bat命令,如果bat操作时间过长,有可能导致阻塞问题,而且不会执行bat直到关闭服务器。
如:
Runtime r=Runtime.getRuntime();Process p=null;try{String path = "D:/test.bat";
p = r.exec("cmd.exe /c "+path);p.waitFor();}catch(Exception e){ System.out.println("运行错误:"+e.getMessage());e.printStackTrace(); }
一般java的exec是没有帮你处理线程阻塞问题的,需要手动处理。(大概原因是,调用Runtime.getRuntime().exec()后,如果不及时捕捉进程的输出,会导致JAVA挂住,看似被调用进程没退出。所以,解决办法是,启动进程后,再启动两个JAVA线程及时的把被调用进程的输出截获)
处理后:
Runtime r=Runtime.getRuntime();Process p=null;try{String path = "D:/test.bat";
p = r.exec("cmd.exe /c "+path);
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR"); errorGobbler.start(); StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT"); outGobbler.start();
p.waitFor();}catch(Exception e){ System.out.println("运行错误:"+e.getMessage());e.printStackTrace(); }
StreamGobbler 类如下:
package com.test.tool;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;/** * 用于处理Runtime.getRuntime().exec产生的错误流及输出流 */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{ try { pw.close();br.close();isr.close();} catch (IOException e) {e.printStackTrace();} } }}
运行bat,就不会阻塞了。
0 0
- java执行bat命令碰到的阻塞问题
- java 执行cmd命令的方式之一(bat)
- java调用命令行Runtime.getRuntime().exec()函数碰到的阻塞问题
- java 运行cmd命令 等待执行bat
- Robot Framework执行碰到的问题
- effective java 碰到的问题
- ShellExecute 执行BAT命令
- 关于.bat文件执行一闪而过的问题
- Bat执行Python脚本的问题
- java调用.bat,.cmd或执行cmd命令并将输出结果显示的代码
- java 执行命令、调用bat文件、调用外部程序的两种方法
- 使用java命令执行bat文件(重启本地指定位置的Tomcat)
- Ant命令编译flex时碰到的问题:[mxmlc] java.lang.OutOfMemoryError: Java heap space
- java执行exe,bat 文件的方法
- windows下执行java应用的bat
- 执行java类的--方法 bat
- java执行需要参数的bat文件
- .bat文件执行问题
- FastDFS分布式文件系统架构剖析
- 不锈钢通风柜
- s:if的用法
- git 用法一
- VC多线程篇
- java执行bat命令碰到的阻塞问题
- Android版DailyInsist(四)——业务逻辑和数据操作RecordFragment
- 三层架构入门
- pdo mysql ----centos
- Ubuntu server下“初始化月份字符串出错”的解决
- 网络验证相关资料
- 替换SQL字段中的换行符,回车符
- VC操作文件、注册表
- js prototype 详解