Executor 에 등록된 작업들의 완료 결과를 얻기위해서는 get 메서드 폴링으로 해야하는데 깔끔하지 않음.
Executor와 BlockingQueue을 짬뽕(?)하여 완료된 작업들의 정보를 받아 올 수 있음
private final ExecutorService executor;
void renderPage(CharSequence source) {
final List<ImageInfo> info = scanForImageInfo(source);
CompletionService<ImageData> completionService = new ExecutorCompletionService<ImageData>(executor);
for (final ImageInfo imageInfo : info) {
// 작업 등록
completionService.submit(new Callable<ImageData>() {
public ImageData call() {
return imageInfo.downloadImage();
}
});
}
try {
for (int t = 0, n = info.size(); t < n; t++) {
// 완료된 작업 꺼내오기
Future<ImageData> f = completionService.take();
ImageData imageData = f.get();
renderImage(imageData);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
throw launderThrowable(e.getCause());
}
}