2014-07-06 68 views
1

我有這樣的代碼在我的程序:執行Java中的外部程序 - 巨大的CPU負載

 ProcessBuilder builder = new ProcessBuilder(command); 

     builder.directory(new File(Vars.pathToForFfmpegBinDir)); 

     final Process process = builder.start(); 

     InputStream is = process.getErrorStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     while ((line = br.readLine()) != null) { 
      System.out.println("!!! "+line); 
     } 

由於外部程序得到很多輸出信息,它的加載每while週期一個CPU內核的100%。

我嘗試這種代碼的另一個版本:

 ProcessBuilder builder = new ProcessBuilder(command); 
     builder.redirectError(new File(pathToForModerationDir+"/1err.log")); 
     builder.redirectOutput(new File(pathToForModerationDir+"/1inp.log")); 
     builder.directory(new File(Vars.pathToForFfmpegBinDir)); 

     final Process process = builder.start(); 
     process.waitFor(); 

但它加載每個進程的一個CPU內核的100%。

如何在此代碼中減少CPU負載?

+1

如果您從終端執行外部命令,您沒有CPU負載問題? – Djizeus

+0

程序中的部分內容爲:「處理映像」對於CPU負載問題並不好。 –

+0

不,在cmd程序中執行得很好。 CMD使用率〜0.5%... –

回答

0

當我運行這個時,我試圖在top上找到它,但它使用的CPU不到0.1%,並且沒有出現在我的用戶標識的前20個進程中。

ProcessBuilder builder = new ProcessBuilder("sh", "-c", "while true; do sleep 1; date; done"); 
builder.redirectErrorStream(true); 
final Process process = builder.start(); 

try (BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()))) { 
    for (String line; (line = br.readLine()) != null;) 
     System.out.println("!!! " + line); 
}