Java solution to the blocking problem encountered by executing the bat command

  • 2020-04-01 02:51:39
  • OfStack

Using Java to execute the bat command can cause blocking problems if the bat operation takes too long and the bat is not executed until the server is shut down.
Such as:


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(" Runtime error :"+e.getMessage());  
     e.printStackTrace();   
}  

Normal Java exec does not help you with thread blocking, you need to handle it manually.
After the treatment:


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(" Runtime error :"+e.getMessage());  
            e.printStackTrace();   
   }  

The StreamGobbler class is as follows:


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;  

  
  
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();  
            }  
        }  
    }  
}   

Run the bat, and it won't block.


Related articles: