繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM