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()
这个问题是关于 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()