我刚刚在 这篇博 文中找到了 CompletionService。但是,这并没有真正展示 CompletionService 相对于标准 ExecutorService 的优势。可以使用任何一种编写相同的代码。那么,什么时候 CompletionService 有用呢?
您能否提供一个简短的代码示例以使其清晰明了?例如,此代码示例仅显示不需要 CompletionService 的位置(= 相当于 ExecutorService)
ExecutorService taskExecutor = Executors.newCachedThreadPool();
// CompletionService<Long> taskCompletionService =
// new ExecutorCompletionService<Long>(taskExecutor);
Callable<Long> callable = new Callable<Long>() {
@Override
public Long call() throws Exception {
return 1L;
}
};
Future<Long> future = // taskCompletionService.submit(callable);
taskExecutor.submit(callable);
while (!future.isDone()) {
// Do some work...
System.out.println("Working on something...");
}
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
原文由 ripper234 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用
ExecutorService
,提交要运行的任务后,您需要手动编码以有效地获取完成任务的结果。使用
CompletionService
,这几乎是自动化的。您提供的代码中的区别不是很明显,因为您只提交了一项任务。但是,假设您有一个要提交的任务列表。在下面的示例中,多个任务被提交给 CompletionService。然后,它不会试图找出哪个任务已完成(以获取结果),它只是要求 CompletionService 实例在结果可用时返回结果。