1、使用队列来完成Executor的线程池管理。
2、CompletionService整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take和poll方法,在结果完整可用时获得这个结果。ExecutorCompletionService是实现CompletionService接口的一个类,并将计算任务委托给一个Executor.
3、在构造函数中创建一个BlockingQueue,用它去保存完成的结果。计算完成时会调用FutureTask中done方法,当提交了一个任务后,首先把这个任务包装为一个QueueFuture,它是FutureTask的一个子类,然后覆写done方法,将结果置入BlockingQueue中.
4、
private class QueueingFuture<V>extends FutureTask<V>{
QueueingFuture(Callable<V>c){super(c);}
QueueingFuture(Runnable t, Vr){super(t,r);}
protected void done(){
completionQueue.add(this);
}
}
5、新的网页渲染器
public class Renderer{
privatefinal ExecutorService executor;
Renderer(ExecutorService executor){this.executor=executor;}
voidrenderPage(CharSequence source){
final List<ImageInfo>info=scanForImageInfo(source);
CompletionService<ImageData>completionService=
newExecutorCompletionService<ImageData>(executor);
for (final ImageInfo imageinfo:info)
completionService.submit(newCallable<ImageData>(){
public ImageData call(){
return imageinfo.downloadaImage();
}
});
renderText(source);
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) {throwlaunderThrowable(e.getCause());}
}
}
}