[英]How should I execute external commands using multithreading in Java?
我想重复运行一个外部程序N次,每次等待output并处理它。 由于顺序运行太慢,我尝试了多线程。 代码如下所示:
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();
让主线程在每个子线程上等待?
waitFor()
调用在这里不是您的问题(实际上是导致生成的线程等待生成的外部程序完成,而不是主线程等待生成的线程)。
无法保证 Java 何时开始执行线程。 因此,如果您正在运行的外部程序很快完成,那么运行它们的一些线程很可能会在所有程序启动之前完成。
另请注意,CPU 使用率不一定是并发执行的良好指南,因为您的 Java 程序除了等待外部程序完成之外什么都不做。 更有用的是,您可以查看已执行程序的数量(使用ps
或任务管理器或其他)。
您的问题与此线程中的问题不同吗: 如何使用 ExecutorService 等待所有线程完成?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.