java執行bat命令碰到的阻塞問題的解決方法

NO IMAGE

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

您可能感興趣的文章:

Java併發程式設計之阻塞佇列詳解剖析Java中阻塞佇列的實現原理及應用場景深入理解Java執行緒程式設計中的阻塞佇列容器Java中使用阻塞佇列控制執行緒集例項詳解Java多執行緒程式設計中LockSupport類的執行緒阻塞用法java socket長連線中解決read阻塞的3個辦法java執行緒阻塞中斷與LockSupport使用介紹Java中的阻塞佇列詳細介紹