在这个例子中,我向比较器对象提交了一些文件。这一切都很好,除了我注意到提交文件的顺序并不总是与它们返回的顺序相同。关于如何更好地控制这个的任何建议?
ExecutorService pool = Executors.newFixedThreadPool(5);
CompletionService<Properties> completion = new ExecutorCompletionService<Properties>(pool);
for (String target : p.getTargetFiles()) {
completion.submit(new PropertiesLoader(target, p));
}
for (@SuppressWarnings("unused")
String target : p.getTargetFiles()) {
Properties r = null;
try {
r = completion.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
p.addTargetFilesProperties(r);
}
pool.shutdown();
答案 0 :(得分:3)
使用CompletionService.take
的要点是让它返回Future
已完成的任何内容,无论它们提交的顺序如何。如果你想按顺序返回它们,你可能根本不使用它(你可能根本不想使用CompletionService
,但你可以)。保留从Future
返回的submit()
个对象的列表,并在每个对象上调用.get()
;它会阻塞,直到结果可用。
答案 1 :(得分:0)
当一次向ThreadPoolExecutor提交多个任务时,您无法真正控制终止时间,因为它们是由多个线程同时执行的。 完成服务按照它们完成的顺序返回它们,这可能因执行而异。如果您决定按顺序执行任务,则完成顺序与激活顺序相同。
- 编辑 -
如果您仍想要并发,但希望按特定顺序等待任务,请不要使用完成服务。只需按所需顺序循环到期货,并调用它们的get()方法,如果需要,可以阻止它。