Java 并发编程实战学习笔记——寻找可强化的并行性

寻找可强化的并行性
1.串行执行所有任务

代码 复制 - 运行


package net.jcip.examples; 

import java.util.*; 

/** 
 * SingleThreadRendere 
 * <p/> 
 * Rendering page elements sequentially 
 * 
 * @author Brian Goetz and Tim Peierls 
 */ 
public abstract class SingleThreadRenderer { 
    void renderPage(CharSequence source) { 
        renderText(source); 
        List<ImageData> imageData = new ArrayList<ImageData>(); 
        for (ImageInfo imageInfo : scanForImageInfo(source)) 
            imageData.add(imageInfo.downloadImage()); 
        for (ImageData data : imageData) 
            renderImage(data); 
    } 

    interface ImageData { 
    } 

    interface ImageInfo { 
        ImageData downloadImage(); 
    } 

    abstract void renderText(CharSequence s); 
    abstract List<ImageInfo> scanForImageInfo(CharSequence s); 
    abstract void renderImage(ImageData i); 
} 


2.并行执行页面渲染,和所有图片下载任务。

代码 复制 - 运行


package net.jcip.examples; 

import java.util.*; 
import java.util.concurrent.*; 
import static net.jcip.examples.LaunderThrowable.launderThrowable; 

/** 
 * FutureRenderer 
 * <p/> 
 * Waiting for image download with \Future 
 * 
 * @author Brian Goetz and Tim Peierls 
 */ 
public abstract class FutureRenderer { 
    private final ExecutorService executor = Executors.newCachedThreadPool(); 

    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> imageData = future.get(); 
            for (ImageData data : imageData) 
                renderImage(data); 
        } catch (InterruptedException e) { 
            // Re-assert the thread's interrupted status 
            Thread.currentThread().interrupt(); 
            // We don't need the result, so cancel the task too 
            future.cancel(true); 
        } catch (ExecutionException e) { 
            throw launderThrowable(e.getCause()); 
        } 
    } 

    interface ImageData { 
    } 

    interface ImageInfo { 
        ImageData downloadImage(); 
    } 

    abstract void renderText(CharSequence s); 

    abstract List<ImageInfo> scanForImageInfo(CharSequence s); 

    abstract void renderImage(ImageData i); 
} 


3.并行执行页面渲染,和单个图片下载任务。

代码 复制 - 运行


package net.jcip.examples; 

import java.util.*; 
import java.util.concurrent.*; 
import static net.jcip.examples.LaunderThrowable.launderThrowable; 

/** 
 * Renderer 
 * <p/> 
 * Using CompletionService to render page elements as they become available 
 * 
 * @author Brian Goetz and Tim Peierls 
 */ 
public abstract class Renderer { 
    private final ExecutorService executor; 

    Renderer(ExecutorService executor) { 
        this.executor = executor; 
    } 

    void renderPage(CharSequence source) { 
        final List<ImageInfo> info = scanForImageInfo(source); 
        CompletionService<ImageData> completionService = 
                new ExecutorCompletionService<ImageData>(executor); 
        for (final ImageInfo imageInfo : info) 
            completionService.submit(new Callable<ImageData>() { 
                public ImageData call() { 
                    return imageInfo.downloadImage(); 
                } 
            }); 

        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) { 
            throw launderThrowable(e.getCause()); 
        } 
    } 

    interface ImageData { 
    } 

    interface ImageInfo { 
        ImageData downloadImage(); 
    } 

    abstract void renderText(CharSequence s); 

    abstract List<ImageInfo> scanForImageInfo(CharSequence s); 

    abstract void renderImage(ImageData i); 

} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java码界探秘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值