博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程
阅读量:4686 次
发布时间:2019-06-09

本文共 2413 字,大约阅读时间需要 8 分钟。

import java.util.ArrayList;

import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
* 示例-异步渲染页面的文字和图片信息
* @author lufang
public abstract class PageRenderer {
private final ExecutorService executor = createExecutorService();
* 渲染页面
* @param source
* 页面源码
public void renderPage(CharSequence source) {
final List<String> imagePaths = scanForImagePaths(source);
Callable<List<ImageData>> task = new Callable<List<ImageData>>() {
public List<ImageData> call() {
List<ImageData> result = new ArrayList<ImageData>();
for (String path : imagePaths)
result.add(downloadImage(path));
return result;
Future<List<ImageData>> future = executor.submit(task);
renderText(source);
try {
List<ImageData> imageData = future.get();
for (ImageData data : imageData)
renderImage(data);
} catch (InterruptedException e) {
// 因为在得到这个异常的同时,线程的中断状态已经被清除了,需要保留线程的中断状态,则需要调用Thread.currentThread().interrupt()
Thread.currentThread().interrupt();
// 取消任务
future.cancel(true);
} catch (ExecutionException e) {
launderThrowable(e.getCause());
} finally {http://www.huiyi8.com/moban/
afterRender(); 
* 简单的抛出异常, 子类可覆盖并提供自己的实现
* @param cause
* 接收到的异常
* @return Throwable 经检查后的异
protected Throwable launderThrowable(Throwable cause) {
return new Throwable(cause);*
* 渲染结束动作, 默认无操作, 子类可覆盖并提供自己的实现
protected void afterRender() {
// do nothing
* 交由子类决定如何构造线程池
*
* @return ExecutorService 线程池
*/
protected abstract ExecutorService createExecutorService();
* 交由子类决定如何提取图片地址
* @param source
* 页面源码
* @return 图片地址列表
protected abstract List<String> scanForImagePaths(CharSequence source);
* 交由子类决定如何下载文字
* @param source
* 页面源码
protected abstract void renderText(CharSequence source);
* 交由子类决定如何渲染图片
*
* @param data
* 图片信息
protected abstract void renderImage(ImageData data);
* 交由子类决定如何下载图片
* @param path
* 路径
* @return ImageData 图片信息
*/
protected abstract ImageData downloadImage(String path);

* 图片基本信息

* @author lufang
public static class ImageData {
private long height;
private long width;
private String uri;
public long getHeight() {
return height;
public void setHeight(long height) {
this.height = height;
public long getWidth() {
return width;
public void setWidth(long width) {
public String getUri() {
return uri;
public void setUri(String uri) {
this.uri = uri;

转载于:https://www.cnblogs.com/cjings/p/3863123.html

你可能感兴趣的文章
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
修改node节点名称
查看>>
Java 文件下载
查看>>
图论——读书笔记 (深度优先搜索)
查看>>
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>
编译原理实验一
查看>>
Git for Android Studio 学习笔记
查看>>
pip 警告!The default format will switch to columns in the future
查看>>
Arrays类学习笔记
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>