2012-02-08 53 views
2

我必須爲java中的多線程和多進程架構之間的性能差異做一個基準測試。這是我用來創建新的進程有沒有辦法知道我的主要Java程序啓動的所有進程何時完成執行?

  for(int i=0;i<100;i++) 
      { 
      try { 
       Process p = Runtime.getRuntime().exec("java -jar myjar.jar " + input); 
      } catch (Exception e) { 
       System.out.println("Exception in creating process"); 
       e.printStackTrace(); 
      } 
      } 

是否有辦法由我主Java程序啓動的所有進程已執行完畢知道的代碼?

回答

2

是:呼叫waitFor每個過程:

for (Process p: processes) // you must save your Process references somewhere :) 
    p.waitFor(); 

如果P是已完成該方法inmediatly返回。如果不是,它會等待。

編輯:如果您需要同時做其他事情,請在另一個主題中執行此操作。該線程將結束循環時,所有的過程都將終止,你可以做其他事情:

final List<Process> processes = new ArrayList<Process>(); 

// start processes 
for (...) { 
    p = ... 
    processes.add(p); 
} 

// create and start "watchdog" thread 
new Thread() { 
    public void run() { 
     for (p: processes) 
     p.waitFor(); 

     // at this point all processes are terminated 
    }.start(); 

// ok, I've started the "watchdog" thread. now let's do fun stuff... 

// do my stuff... 
2

Process.waitFor看一看,這將阻止,直到催生子進程已經終止。

要使用這個,你必須存儲在某種集合中創建的所有Process對象,然後遍歷它們,調用waitFor - 但這並不複雜。

0
List<Process> processes = new ArrayList<Process>(); 

for (...) { 
    processes.add(Runtime.getRuntime().exec(...)); 
} 
volatile int processesCount = processes.size(); 

for (Process p : processes) {  
    new Thread() { 
     public void run() { 
     p.waitFor(); 
     processesCount --; 
     } 
    }.start();  
} 

while (processesCount !=0) { 
    //do nothing 
} 

//now all the processes were terminated. 
相關問題