//callable与Future接口
public interface Callable<V>{
V call() throws Exception;
}
public interface Future<V>{
boolean cancel(boolean mayInterruptedIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws InterruptedException,ExecutionException,CancellationException;
V get(long timeout,TimeUnit unit) throws InterruptedException,ExecutionException,CancellationException;
}
//newTaskFor
protected <T> RunnableFuture<T> newTaskFor(Callable<T> task){
return new FutureTask<T>(task);
}
//使用Future等待图像下载
public class FutureRender{
private final ExecutorService executor = ...;
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);
//渲染文本
renderText(source);
//渲染图片
try{
List<ImageData> imageDatas = future.get();
for(ImageData data : imageDatas){
renderImage(data);
}
}catch(InterruptedException e){
Thread.currentThread().interrupt();
future.cancel(true);
}catch(ExecutionException e){
throw launderThrowable(e.getCause());
}
}
}
异构任务并行化示例
最新推荐文章于 2022-09-23 09:47:47 发布