【问题标题】:Running java runtime.exec() for multiple process为多个进程运行 java runtime.exec()
【发布时间】:2013-08-02 06:58:06
【问题描述】:

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

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

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

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

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

关于如何实现这一点的任何帮助,有人可以就上述要求分享一个 sn-p 吗?

【问题讨论】:

    标签: java runtime.exec


    【解决方案1】:

    使用大小为 4 的 ThreadPoolExecutor 和启动 Process 然后调用 Process.waitFor()Runnable 实现。由于线程池将被限制为 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();
        }
    });
    

    【讨论】:

    • 主线程?入口线程?我不会为 OP 编写程序,只是指出一个好的路径。
    • @蒂姆·本德:+1。恭喜你 10k :)
    【解决方案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 对象表示的已终止。该方法返回 如果子进程已经终止,则立即。如果 子进程尚未终止,调用线程将被阻塞 直到子进程退出。

    【讨论】:

    • 感谢您的即时响应。我尝试了这种方法,线程池计数为 4,但在启动和完成 4 个进程后执行终止。线程不称为 post 4 进程。任何建议
    • @user2644818 我已经编辑了代码以包含适合我的代码。 4个线程连续运行该进程,一旦退出,线程就会在while循环中再次运行它,直到您调用shutdownNow()
    【解决方案3】:

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

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

    然后启动其中四个线程。

    【讨论】:

    • 这个解决方案所做的只是将问题从管理子进程生命周期的问题转变为管理线程生命周期的问题。正如我在回答中提到的那样,从其他回答者那里得到提示并抛出一个 ExecutorService ..
    • @TimBender 他的例子是完整的,它有一个 Runtime.getRuntime ,我可以将它完全复制粘贴到我的代码中。如果你也这样做,你的答案可能是正确的......
    • @Radu SO 的目的不一定是创建复制/粘贴答案,而是创建好的答案。我的评论仍然很有效,而且这个答案质量很低,但 OP 有权接受他们选择的任何答案。
    • @TimBender 正如你所说,人们有选择的权利。我先生,请选择不要用所有关于事物的东西来蒙蔽我的头脑。
    【解决方案4】:

    您可以使用大小为 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
                }
            });
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      相关资源
      最近更新 更多