有没有办法知道我的主java程序启动的所有进程何时完成执行?

时间:2012-02-08 11:01:56

标签: 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程序启动的所有进程何时完成执行?

3 个答案:

答案 0 :(得分:3)

是:请为每个流程调用waitFor

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

如果p已经完成,则该方法返回inmediatly。如果不是,那就等了。

编辑:如果您需要同时执行其他操作,请在另一个线程中执行/ wait。当所有进程终止时,线程将结束循环,你可以做其他事情:

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...

答案 1 :(得分:2)

查看Process.waitFor,它将一直阻塞,直到生成的子进程终止。

要使用它,您必须存储在某种集合中创建的所有Process个对象,然后在调用waitFor时循环遍历它们 - 但这并不太复杂。

答案 2 :(得分: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.