2011-05-29 26 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

相关问题