java执行bat命令碰到的阻塞问题的解决方法

时间:2022-03-20 21:59:16

使用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 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,就不会阻塞了。