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

为多进程运行java runtime.exec(),java,runtime.exec,Java,Runtime.exec,在我的程序中,我确实有一个n项的列表 我将迭代列表并启动如下过程: Runtime.getRuntime.exec("cmd /C start abc.bat"+listitem() ) 我需要维护4个进程的计数。完成任何一个流程后,我需要启动下一个流程,因此流程计数应为4 我能够同时启动4个进程,但不确定如何保持4的计数。基本上我需要一些通知一旦进程终止,所以我可以开始下一个,任何线程都是可能的 关于如何实现这一点有什么帮助吗?有人能分享关于上述要求的代码片段吗?使用大小为4的ThreadP

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

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

Runtime.getRuntime.exec("cmd /C start abc.bat"+listitem() )
我需要维护4个进程的计数。完成任何一个流程后,我需要启动下一个流程,因此流程计数应为4

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


关于如何实现这一点有什么帮助吗?有人能分享关于上述要求的代码片段吗?

使用大小为4的
ThreadPoolExecutor
Runnable
实现,该实现启动
进程
,然后调用
进程.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();
    }
});
公共类ProcessRunner{
公共静态void main(字符串[]args)引发IOException、InterruptedException{
//根据需要创建n个线程
ExecutorService exec=Executors.newFixedThreadPool(4);
对于(int i=0;i<4;i++){
exec.execute(newprocessrunnable());
}
睡眠(10000);
//只要你想让他们停下来
exec.shutdownNow();
}   
}
类ProcessRunnable实现Runnable{
@凌驾
公开募捐{
做{
过程p;
试一试{
p=Runtime.getRuntime().exec(“cd..”);
p、 waitFor();
}捕获(IOE异常){
//采取适当步骤
e、 printStackTrace();
}捕捉(中断异常e){
//采取适当步骤
e、 printStackTrace();
}
}而(!Thread.interrupted());
}
}
进程#waitFor()

如有必要,使当前线程等待进程结束 由此进程对象表示的已终止。此方法返回 如果子流程已终止,则立即执行。如果 子进程尚未终止,调用线程将被阻止 直到子流程退出


您应该有四个线程,每个线程从池中获取一个分配,然后执行它,然后在完成后执行下一个分配。这将是如何:

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();
}

然后启动其中四个线程。

您可以使用大小为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
            }
        });
    }
final ExecutorService ex=Executors.newFixedThreadPool(4);
对于(int i=0;i<100;i++){
execute(新的Runnable(){
@凌驾
公开募捐{
…在此处运行进程并等待其结束
}
});
}

主线程?进入线程?我不打算为OP编写程序,只是指出一条好的路径。@Tim Bender:+1。祝贺10k:)此解决方案所做的只是将问题从管理子进程生命周期转变为管理线程生命周期。根据其他回答者的提示,加入一个ExecutorService,正如我在回答中提到的那样。@TimBender他的示例已经完成,其中有一个Runtime.getRuntime,我可以将它完全复制粘贴到我的代码中。如果你也这样做,你的答案可能是正确的…@Radu SO的目的不一定是创建复制/粘贴答案,而是创建好的答案。我的评论仍然很有道理,这个答案质量很低,但OP有权接受他们选择的任何答案。@TimBender正如你所说,人们有权选择。而我,先生,我选择不让我的头被所有关于东西的东西弄得昏昏欲睡。@Radu当然。感谢您的即时响应。我尝试了线程池计数为4的这种方法,但在启动并完成4进程后,执行终止。线程在4进程之后不被称为线程。任何suggestions@user2644818我已经编辑了代码以包含适合我的代码。这4个线程连续运行进程,一旦进程退出,线程将在while循环中再次运行进程,直到调用
shutdownNow()
    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
            }
        });
    }