4

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

我将迭代列表并启动如下过程:

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

我需要保持 4 个进程的计数。一旦任何一个进程完成,我需要启动下一个进程,所以进程数应该是 4。

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

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

4

4 回答 4

12

使用ThreadPoolExecutor大小为 4 的一个Runnable实现,它启动Process然后调用Process.waitFor(). 由于线程池将被限制为 4 个线程,并且所有 4 个线程都将启动一个进程然后等待它,因此您可以确定运行的子进程不会超过 4 个。

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

ExecutorService executor = Executors.newFixedThreadPool(4);

executor.execute(new Runnable() {
    public void run() {
        //use ProcessBuilder here to make the process
        Process p = processBuilder.start();
        p.waitFor();
    }
});
于 2013-08-02T07:00:17.437 回答
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 对象表示的进程终止。如果子进程已经终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。

于 2013-08-02T07:01:43.477 回答
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
            }
        });
    }
于 2013-08-02T07:07:32.673 回答
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();
}

然后启动其中四个线程。

于 2013-08-02T07:05:33.667 回答