我想重复运行外部程序N次,每次等待输出并处理它。由于顺序运行太慢,我尝试了多线程。 代码如下所示:
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();
使主线程在每个子线程上等待吗?
答案 0 :(得分:1)
waitFor()
调用不是你的问题(并且实际上导致生成的线程在生成的外部程序完成时等待,而不是主线程等待生成的线程)。
无法保证Java何时开始执行Threads。因此,很可能如果您运行的外部程序快速完成,那么运行它们的一些线程将在所有程序启动之前完成。
另请注意,CPU使用率不一定是并发执行的良好指南,因为Java程序除了等待外部程序完成外什么都不做。更有用的是,您可以查看已执行程序的数量(使用ps
或任务管理器或其他)。
答案 1 :(得分:-1)