`
Ydoing
  • 浏览: 106087 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java并发编程实践(读书笔记) 任务执行(未完)

 
阅读更多

任务的定义

大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.

任务的执行策略

1.顺序的执行任务

这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任务都要等待处理.响应性很糟糕,吞吐量低.系统资源利用率低.

2.显示的为任务创建线程

为每个任务创建对应一个线程,响应快,系统资源利用路高.缺点是资源消耗量大,如果有大量任务要执行的话,系统迟早会因为无限制创建过多的线程而造成内存耗尽.特别当创建的线程数量远远大于系统的CPU核数,由于每一个核同一时刻只能执行一个线程,所以系统要执行很多不必要的线程上下文切换,造成资源大量浪费.

3.Executor框架

Executor接口本身很简单,就一个execute方法.但是由Executor这个接口衍生出来的类,功能非常强大.可以这么认为,Executor框架这是线程管理的工具.可以对线程的生命周期和执行策略进行管理.

Executor接口

public interface Executor {

    void execute(Runnable command);

}

Executor框架是靠ThreadPoolExecutor实现的,简单理解为是一个线程池.其实是通过线程池和一个阻塞队列BlockingQueue<Runnable>对线程进行管理.

页面渲染器实例


该实例要实现2个任务,第一是渲染文本(速度快),第二个是渲染图片(速度慢).渲染图片的时候要先下载图片才能渲染.

1.第一种方式:顺序执行页面渲染

复制代码
public class SingleThreadRenderer {

    public void renderPage(CharSequence source) {

        renderText(source);// 处理文本,速度快

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

        for (ImageInfo info : scanForImageInfo(source)) {

            imageData.add(info.downloadImage());// 下载图片,速度慢

        }

        for (ImageData data : imageData) {

            renderImage(data);// 处理图片

        }

    }

}
复制代码

这种实现方式简单,但是缺点也很明显,就是渲染文本和渲染图片不能并发执行,CPU利用率低.

2.第二种方式:使用Future实现页面渲染器

Future可以持有异步并发线程的执行结果,Executors可以对线程执行并发操作.

复制代码
public class FutureRenderer {

    private final ExecutorService exec = Executors.newFixedThreadPool(Runtime
            .getRuntime().availableProcessors());

    public void renderPage(CharSequence source) {
        final List<ImageInfo> imageInfos = scanForImageInfo(source);

        Callable<List<ImageData>> task = new Callable<List<ImageData>>() {
            public List<ImageData> call() throws Exception {
                List<ImageData> imageData = new ArrayList<>();
                for (ImageInfo info : imageInfos) {
                    imageData.add(info.downloadImage());// 下载图片,速度慢
                }
                return imageData;
            }
        };

        Future<List<ImageData>> f = exec.submit(task);
        //渲染图片的线程正在执行的同时处理文本任务
        renderText(source);// 处理文本,速度快

        try {
            List<ImageData> imageDatas = f.get();

            for (ImageData data : imageDatas) {
                renderImage(data);// 处理图片
            }
        } catch (InterruptedException | ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
复制代码

这种执行策略仍旧有局限性,这是由于并行运行异类任务并不会获得好的性能.只有大量相互独立的且同类的任务进行并发处理,才能获得真正性能提升.

3.第三种方式:使用CompletionService的页面渲染器

复制代码
public class CompletionServiceRenderer {
    private final ExecutorService exec = Executors.newFixedThreadPool(Runtime
            .getRuntime().availableProcessors());

    public void renderPage(CharSequence source) {

        final List<ImageInfo> imageInfos = scanForImageInfo(source);

        CompletionService<ImageData> completionService = new ExecutorCompletionService<>(
                exec);

        for (final ImageInfo info : imageInfos) {
            Callable<ImageData> task = new Callable<ImageData>() {
                public ImageData call() throws Exception {
                    return info.downloadImage();
                }
            };
            completionService.submit(task);
        }

        renderText(source);// 处理文本,速度快

        for (int i = 0; i < imageInfos.size(); i++) {
            try {
                Future<ImageData> future = completionService.take();
                ImageData imageData = future.get();
                renderImage(imageData);// 处理图片

            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }
}
复制代码


这种方式不用等下载所有图片才处理,而是每下载一张图片就处理,实现了很好的并发行.

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    java并发编程实践pdf笔记

    Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...

    java并发编程实践高清中文版+源码

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    Java并发编程实践高清pdf及源码

    《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...

    JAVA并发编程实践.pdf+高清版+目录 书籍源码

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

    JAVA并发编程实践

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    java并发编程实践(中文版pdf全部40M分2部分上传)2

    《JAVA并发编程实践》既能够成为读者的理论支持,又可以作为构建可靠的、可伸缩的、可维护的并发程序的技术支持。《JAVA并发编程实践》并不仅仅提供并发API的清单及其机制,还提供了设计原则、模式和思想模型,使...

    JAVA并发编程实践.pdf

    《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望了解Java SE 5以及6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 作者简介 作者:(美)戈茨 等 本书作者系lava标准化组织...

    JAVA并发编程实践 pdf

    《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心主题,尤其是在多核处理器普及的今天,利用好并发能够显著提升程序的执行效率和系统性能。这本书以实践为...

    java并发编程实践

    ### Java并发编程实践知识点详解 #### 一、Java并发编程基础 ##### 1.1 并发与并行概念区分 在Java并发编程实践中,首先需要理解“并发”与“并行”的区别。“并发”指的是多个任务同时进行,但实际上可能是在多...

    Java并发编程实践.pdf

    Java并发编程实践.pdf 本文档讲述了Java并发编程实践,特别是使用开源软件Amino构建并发应用程序。Amino是一个开源软件,具有可操作性、跨平台性、无锁数据结构等特点,适用于多核操作系统。下面是本文档的知识点...

    Java并发编程实践-电子书

    Java并发编程实践-电子书-01章.pdf Java并发编程实践-电子书-02章.pdf Java并发编程实践-电子书-03章.pdf Java并发编程实践-电子书-04章.pdf Java并发编程实践-电子书-05章.pdf Java并发编程实践-电子书-06章.pdf ...

    java并发编程实践(第一版)

    《Java并发编程实践》是关于Java语言在并发编程领域的实践指南,作者在本书中详细介绍了在Java编程中,如何高效地实现多线程程序的设计和开发。本书不仅为初学者提供了理论基础,还为有经验的开发者提供了优化并发...

    Java并发编程实践

    《Java并发编程实践》这本书深入探讨了Java平台上的并发编程技术,涵盖了从基础概念到高级策略的广泛主题。在Java编程中,并发处理是优化性能、提高系统资源利用率的关键手段,尤其是在多核处理器和分布式系统中更为...

    java并发编程实践笔记资料.pdf

    Java并发编程实践笔记是一份关于Java并发编程的实践笔记,涵盖了多种关于线程安全、并发编程的实践经验和原则。下面是从笔记中总结的知识点: 1. 保证线程安全的三种方法:不要跨线程访问共享变量,使用final类型的...

Global site tag (gtag.js) - Google Analytics