java - 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;
解决方案
您没有调用任何阻塞方法,Process
因此线程不必等待任何东西,只需将自己标记为准备好执行下一个任务。
我建议你打电话process.waitFor()
推荐阅读
- java - Java:HttpHeaders -LinkedHashMap - ClassCastException 字节到字符串
- python - Python没有跳入“其他”条件
- java - 按升序打印一个数字的所有唯一素因数
- python-3.x - 我不知道为什么它不给我发送报告消息
- javascript - 获取错误索引来自后端
- java - 按钮的图标不匹配
- c++ - 如何重载 [] 运算符来初始化对象
- javascript - 如果超过 3 li 隐藏其余部分并附加 html JQuery
- php - 如何在laravel中将数据从一个表插入另一个表?
- c++ - 如何从所有成员在 C++ 中公开的封闭类访问嵌套类成员函数?