2013-03-14 79 views
2

感謝您的支持。Java - ProcessBuilder中的批處理文件執行被阻止

我正在使用ProcessBuilder從java執行批處理文件。這個執行將在每4分鐘一個線程中繼續。輸出和錯誤將被寫入文件。

這工作正常1或2天。之後,執行線程被阻塞。我將重新啓動應用程序,並在1或2天內正常工作。過去20天我一次又一次地遇到了這個問題。

我試着分析。我沒有從錯誤流中找到任何錯誤。一切都是正確的,直到在日誌文件中打印的最後一條語句。我把線程轉儲和分析。線程狀態

「負載 - 蘇氨酸」 PRIO = 6 TID = 0x0000000009875000 NID = 0x1014可運行的[0x000000000c71e000] java.lang.Thread.State中:RUNNABLE
- 鎖定< 0x00000000894fbeb8>(一個java.io.InputStreamReader中) 在java.io.BufferedReader.readLine(來源不明)
在com.xxx.qqq.load(MyLoad.java:553)==>這是而行()語句

爲什麼它在等待while()語句行無限期?

這是什麼原因造成的?

public void load() 
{  
    BufferedReader br1=null,br2=null; 
    String err=null,err1=null; 
    Process p=null; 
    try 
    { 
       ProcessBuilder pb=new ProcessBuilder(); 
       pb.directory("my work directory given"); 
       pb.command("cmd.exe","/c","www.bat"); 
       pb.redirectErrorStream(true); 
       p=pb.start();               
       br1=new BufferedReader(new InputStreamReader(p.getInputStream())); 
       br2=new BufferedReader(new InputStreamReader(p.getErrorStream())); 
       while((err=br1.readLine())!=null || (err1=br2.readLine())!=null) { if(err!=null) {logtofile(err);} if(err1!=null) {logtofile(err1);}} 
       p.waitFor();                
    } 
    catch(Exception e){e.printStackTrace();} 
    finally 
    { 
     try{ 
      if(p!=null){p.destroy();} 
      if(br1!=null) {br1.close();} 
      if(br2!=null) {br2.close();}     
     }catch(Exception e) { 
      e.printStackTrace(); 
     } 
    }  
} 

public void logtofile(String err){ 
    //all statements are written to file. 
    //file 'll be changed over the time when file size exceeds 2MB. 
} 

回答

0

這個問題已經回答here 。基本上你應該在另一個線程中讀你的流。由於從流中讀取數據會阻止調用,直到某些輸入可用,發生I/O錯誤,或者到達流的末尾。