我的代码中有一个for循环,执行1000次任务。我想减少它的执行时间,所以我试图通过执行器服务或流并行运行它。当我通过大约1000个聚合上的执行程序服务(或流)执行这些任务时,我只能执行大约950个作业。每个作业都会创建一个目录和一些文件。执行器服务实现如下所示。
ExecutorService executor = Executors.newFixedThreadPool(8);
List<Future<?>> futures = new ArrayList<>();
for (String aggr : aggregates) {
Future<?> future = executor.submit(() -> {
//some generation task to be done for each aggregate
});
futures.add(future);
}
try {
for (Future<?> fut : futures) {
fut.get();
}
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
和Streams实现看起来像这样。
aggregates.parallelStream().parallel().forEach(aggr ->{
//some generation task to be done for each aggregate
});
在这两种情况下,它都缺少大约50个工作岗位。 但是,当我像这样顺序运行时,它不会遗漏任何工作。
aggregates.parallelStream().sequential().forEach(aggr ->{
//some generation task to be done for each aggregate
});
为什么要跳过一些工作?我怎样才能并行完成所有工作。我的系统有8个内核和i7处理器。