2012-02-08 92 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. 
相关问题