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
原创粉丝点击