为多个进程运行java runtime.exec()

时间:2013-08-02 06:58:07

标签: java runtime.exec

在我的程序中,我有一个n项列表。

我将迭代列表并启动这样的过程:

Runtime.getRuntime.exec("cmd /C start abc.bat"+listitem() )

我需要保持4个进程的计数。完成任何一个过程后,我需要启动下一个过程,因此过程计数应为4。

我能够同时启动4个进程,但不确定如何保持4的计数。基本上我需要一个通知,一旦进程终止,所以我可以开始下一个,任何线程都是可能的。

关于如何实现这一点的任何帮助,有人可以分享上述要求的片段吗?

4 个答案:

答案 0 :(得分:12)

使用大小为4的ThreadPoolExecutor和启动Runnable的{​​{1}}实施,然后调用Process。由于线程池将限制为4个线程,并且所有4个线程将启动进程然后等待它,您将确定不会有超过4个子进程在运行。

一些示例代码可以帮助您:

Process.waitFor()

答案 1 :(得分:2)

 public class ProcessRunner {

    public static void main(String[] args) throws IOException, InterruptedException {
        //Creating n threads as required
        ExecutorService exec = Executors.newFixedThreadPool(4);
        for(int i = 0; i < 4; i++){
            exec.execute(new ProcessRunnable());
        }

        Thread.sleep(10000);

        //whenever you want them to stop
        exec.shutdownNow();

    }   

}

class ProcessRunnable implements Runnable{
       @Override
       public void run(){
        do{
           Process p;
        try {
            p = Runtime.getRuntime().exec("cd ..");
            p.waitFor(); 
        } catch (IOException e) {
                    //Take appropriate steps
            e.printStackTrace();
        } catch (InterruptedException e) {
                    //Take appropriate steps
            e.printStackTrace();
        }

        }while(!Thread.interrupted());
       }
}

处理#WAITFOR()

  

如果需要,导致当前线程等待,直到进程   由此Process对象表示已终止。此方法返回   如果子进程已经终止,则立即执行。如果   子进程尚未终止,调用线程将被阻塞   直到子进程退出。

答案 2 :(得分:1)

你应该有四个线程,每个线程从一个池中获取一个赋值,然后执行它,然后当它完成时,执行下一个赋值。这将是如何:

class Whatever extends Thread {
    public void run() {
        while (!interrupted()) {
            String str = listitem();
            if (str == null) // there are no more commands to run
                break;
            Runtime.getRuntime.exec(("cmd /C start abc.bat"+str).split("\\s")).waitFor();
}

然后启动其中四个线程。

答案 3 :(得分:1)

您可以使用大小为4的固定线程池,在任何给定时刻保证不超过4个活动线程

    final ExecutorService ex = Executors.newFixedThreadPool(4);
    for(int i = 0; i < 100; i++) {
        ex.execute(new Runnable() {
            @Override
            public void run() {
              ... run the process here and wait for it to end
            }
        });
    }