我应该如何在Java中使用多线程执行外部命令?

时间:2011-05-29 20:11:32

标签: java multithreading

我想重复运行外部程序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();使主线程在每个子线程上等待吗?

2 个答案:

答案 0 :(得分:1)

waitFor()调用不是你的问题(并且实际上导致生成的线程在生成的外部程序完成时等待,而不是主线程等待生成的线程)。

无法保证Java何时开始执行Threads。因此,很可能如果您运行的外部程序快速完成,那么运行它们的一些线程将在所有程序启动之前完成。

另请注意,CPU使用率不一定是并发执行的良好指南,因为Java程序除了等待外部程序完成外什么都不做。更有用的是,您可以查看已执行程序的数量(使用ps或任务管理器或其他)。

答案 1 :(得分:-1)

与你在这个帖子中的问题不同:How to wait for all threads to finish, using ExecutorService?