我剛剛在this blog post找到CompletionService。但是,這並沒有真正展示CompletionService相對於標準ExecutorService的優勢。相同的代碼可以用任何一種書寫。那麼,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();
}
另一個例子參見Java Concurrency in Practice pg。有一個CompletionService用於在圖像可用時渲染圖像。 – Pete 2012-04-29 04:38:17