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());
    }
}