Java ExecutorService 一次拉取所有任务

Java ExecutorService pulls tasks all at once

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

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

我是否必须在 lambda 中单独编写 "Process process = Runtime.getRuntime()" class 并在 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;

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

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