对于实现Runnable接口的线程,运行过程中无法得到对象的返回值,Callbale接口就可以做到获取线程运行的结果.
每一个任务都是一个线程,利用ExecuteorService.submit来提交,然后返回Future对象,这个对象有任务的生命周期,提供了相应的方法来判断是否已经完成或者取消以及获取任务的结果和取消任务等.get方法的行为取决于任务的状态(未开始,运行,己完成).己完成那么get会立即返回或者抛出异常,如果任务没有完成,get将阻塞并直到任务完成.任务出现异常时,get将异常封装后重新抛出.
Executor执行的任务有4个生命周期:创建,提交,开始,完成 已经完成和提交未开始的任务可以取消,正在进行中的任务,响应中断才可以取消.
void renderPage(CharSequence source){
final List<ImageInfo> imageInfos = scanforImageInfo(source);
Callable<List<ImageData>> task = new Callable<List<ImageData>>(){
public List<ImageData> call(){
List<ImageData> result = new ArrayList<ImageData>();
for(ImageInfo imageInfo:imageInfos){
result.add(imageInfo.downloadImage());
}
return result;
};
Future<List<ImageData>> future = executor.submit(task);
try{
List<ImageData> imageData = future.get();
for(ImageData data:imageData) renderImage(data);
}catch(InterruptedException e){
Thread.currentThread().interrupt();future.cancel(true);
}catch(ExcutionException e){
throw launderThrowable(e.getCause())}
}
}
}