Java併發編程

import java.util.ArrayList;java

import java.util.List;異步

import java.util.concurrent.Callable;ide

import java.util.concurrent.ExecutionException;ui

import java.util.concurrent.ExecutorService;this

import java.util.concurrent.Future;spa

 * 示例-異步渲染頁面的文字和圖片信息線程

 * @author lufangorm

public abstract class PageRenderer {圖片

    private final ExecutorService executor = createExecutorService();get

     * 渲染頁面

     * @param source

     *            頁面源碼

    public void renderPage(CharSequence source) {

        final List<String> p_w_picpathPaths = scanForImagePaths(source);

        Callable<List<ImageData>> task = new Callable<List<ImageData>>() {

            public List<ImageData> call() {

                List<ImageData> result = new ArrayList<ImageData>();

                for (String path : p_w_picpathPaths)

                    result.add(downloadImage(path));

                return result;

        Future<List<ImageData>> future = executor.submit(task);

        renderText(source);

        try {

            List<ImageData> p_w_picpathData = future.get();

            for (ImageData data : p_w_picpathData)

                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;

相關文章
相關標籤/搜索