首页 > 解决方案 > Java ExecutorService 一次性拉取所有任务

问题描述

这个问题是关于Java并发的。我正在尝试让 cmdline 执行另一个应用程序,该应用程序在 Windows 10 和 Server 2012R2 中采用 cmdline 参数。基本上我正在尝试一次针对 5 个文件运行程序(线程池为 5)。问题是,我无法让 Java 一次运行的应用程序实例不超过 5 个。如果不是 Thread.sleep 方法,它基本上会尝试一次为每个文件启动一个实例。

我尝试启动的程序确实在 cmdline 和 powershell 中返回输出(我也尝试过),所以我试图欺骗 Java 等待实例完全完成文本和 lambda 中的 java.isAlive 循环,所以只有在处理分配给它的文件后进程自身终止时,进程才会完成 lambda。这些都没有奏效。

我是否必须在单独的类中的 lambda 中编写“Process process = Runtime.getRuntime()”并在 lambda 中创建一个新对象而不是使用参数?有任何想法吗?

                ExecutorService service = Executors.newFixedThreadPool(5);
                File file = new File("SCAP_Hosts/");
                File[] f = file.listFiles();
                for (File x : f) {
                    String y = x.toString();
                    Future<?> result = service.submit(() -> {
                        Process process = Runtime.getRuntime().exec("c:/Software/SCAP Compliance Checker 5.0.2/cscc.exe -o WSoptions.xml -f " + y);
                        try {
                            Thread.sleep(60000);
                            x.delete();
                            } catch (IOException | InterruptedException e) {e.printStackTrace();}
                    });
                    try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}
                }
            } 
            }
            service.shutdown();
            while (true) {
                if (service.isTerminated()) {
                    System.out.println("Program Finished");
                    break;

标签: javajava-threads

解决方案


您没有调用任何阻塞方法,Process因此线程不必等待任何东西,只需将自己标记为准备好执行下一个任务。

我建议你打电话process.waitFor()


推荐阅读