2011-05-29 77 views
3

我想運行一個外部程序重複N次,每次等待輸出並處理它。由於順序運行速度太慢,我嘗試了多線程。 的代碼看起來是這樣的:我應該如何在Java中使用多線程執行外部命令?

public class ThreadsGen { 

public static void main(String[] pArgs) throws Exception { 
    for (int i =0;i < N ; i++) 
    { 
     new TestThread().start(); 
    } 
} 

static class TestThread extends Thread { 

public void run() { 
     String cmd = "programX"; 
     String arg = "exArgs"; 

     Process pr; 
     try { 
      pr = new ProcessBuilder(cmd,arg).start(); 

     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     try { 
      pr.waitFor(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     //process output files from programX. 
     //... 
} 

然而,在我看來,只有一個線程同時運行(通過檢查CPU使用率)。
我想要做的是獲取所有線程(除了正在等待programX完成的線程)工作嗎?我的代碼有什麼問題?

是否因爲pr.waitFor();使主線程等待每個子線程?

回答

1

waitFor()調用在這裏不是你的問題(並且實際上導致產生的線程等待產生的外部程序的完成,而不是等待產生的線程的主線程)。

當Java開始執行線程時,沒有任何保證。因此,如果您正在運行的外部程序很快完成,那麼一些運行它們的線程將在所有程序啓動之前完成。

另請注意,CPU使用率並不一定是並行執行的好指南,因爲您的Java程序除了等待外部程序完成之外什麼也不做。更有用的你可以看看執行的程序的數量(使用ps或任務管理器或其他)。

+0

謝謝。對不起,遲來的回覆 – 2011-06-07 13:32:49

相關問題