`
sunhuaer123
  • 浏览: 6360 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java并行开发笔记3.2

    博客分类:
  • java
阅读更多

  关于页面渲染的不同操作解析:

问题:一般地,对HTML文档进行处理时,当遇到文本标签时,将其绘制到图像缓存中。当遇到图像引用时,先通过网络获取它,然后再将其绘制到图像缓存中。

 

     1. 串行地渲染页面元素,即普通的网页页面中图片和文本同时加载
public 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);
       }

   }
}
 

   2. 使用Future等待图像下载,即稍微高级点页面内容加载成功后,等待图片加载。FutureRender使得渲染文本任务与下载图像数据的任务并发地执行。

 

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> imageData = future.get();
             for(ImageData data : imageData)
                  renderImage(data);  
         }catch(InterruptedExcepiton e){
             //重新设置线程的中断状态
             Thread.currentThread().interrupt();
             //由于不需要结果,因此取消任务
             future.cancel(true);
         }catch(ExecutionException e){
             throw launderThrowable(e.getCause());
         }
   }
}

 

    在上个示例中,并行地执行两个不同类型的任务——下载图像与渲染页面。然而,通过对异构任务进行并行化来获得重大的性能提升是很困难的。因为,如果渲染文本的速度远远高于下载图像的速度,那么程序的最终性能与串行执行时的性能差别不大,而代码却变的更复杂了。

    只有当大量相互独立且同构的任务可以并发进行处理时,才能体现出将程序的工作负载分配到多个任务中带来的真正性能提升

 

    3. 使用CompletionService,是页面元素在下载完成后立即显示出来。其中,图片是单个下载完成就立即显示。

       CompletionService将Executor和BlockingQueue的功能融合在一起。可以将Callable任务提交给它执行,然后使用类似于队列操作的take和poll等方法来获得已完成的结果,而这些结果会在完成时被封装为Future。ExecutorCompletionService实现了CompletionService,并将计算部分委托给一个Executor。

public class Renderere{
		private final ExecutorService executor;
		
		Renderer(ExecutorService executor)
		{
			this.executor = executor;
		}
		
		void renderPage(CharSequence source){
			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());
			}			
		}
	}

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA并行计算的一些资料 论文

    Java作为一种广泛使用的编程语言,具有跨平台的特性,使得它在并行计算领域也占据了一席之地。下面将详细介绍Java并行计算的相关知识点。 1. **Java多线程基础**:Java并行计算的核心在于多线程技术。Java提供了...

    基于Web的Java并行计算

    ### 基于Web的Java并行计算 #### 摘要 本文深入探讨了如何运用Java技术在Web环境中执行并行数据处理程序的关键问题。文章首先介绍了基于Web的Java并行计算的基本概念及其背景,随后详细分析了利用Java进行Web上...

    JAVA并行模式

    JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    java 并行编程

    Java 并行编程是利用多核处理器或者分布式计算资源来提高程序执行效率的重要技术。在Java 1.7版本中,引入了一套强大的并行框架,使得开发者能够更方便地编写出高效、可扩展的并发应用程序。这个压缩包文件...

    Java 并行机制的核心

    ### Java并行机制的核心知识点解析 #### 一、Java并发机制概述 Java作为一种广泛应用的编程语言,自诞生之初就内置了关键的并发概念,如线程(Thread)和锁(Lock)。随着多核处理器的普及以及对高性能计算的需求...

    java并行排序程序 parallel

    Java并行排序(Parallel Sort)是Java集合框架中提供的一种高效的数据排序方法,它利用了多核处理器的优势,通过并行处理技术来提高排序的速度。在这个经典例子中,我们将深入探讨Java并行排序的工作原理、实现方式...

    java8并行计算示例

    Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中并行计算是其一大亮点。本示例通过利用Java 8的并行流(Parallel Stream)特性,显著提升了计算效率,具体体现在对1到400亿数列求和的问题上。传统顺序...

    java 并行爬取网页

    【标题】:“Java 并行爬取网页” 在Java编程中,实现并行爬取网页是一种提高效率的有效方法。这通常涉及到多线程或者更高级的并发机制,如Fork/Join框架。在这个项目中,开发者在Eclipse集成开发环境中编写了一个...

    java并行计算圆周率

    在Java编程语言中,实现并行计算圆周率是一项挑战性的任务,但通过利用多线程和适当的算法,我们可以大大提高计算效率。在这个项目中,我们关注的是如何在4个线程的状态下,3分钟内计算出圆周率的第62到63万位小数。...

    java并行计算 JAVA的MPI---MPJ 第一部分

    java并行计算 JAVA的MPI---MPJ java并行计算 JAVA的MPI---MPJ java并行计算 JAVA的MPI---MPJ java并行计算 JAVA的MPI---MPJ java并行计算 JAVA的MPI---MPJ

    java并行编程(Java Concurrency in Practice) 英文版chm

    &lt;&lt;java并行编程&gt;&gt;英文版chm格式,英文名称&lt;Java Concurrency in Practice&gt;,一直想买这本书,但总是缺货,找到了电子版,分享给大家。 Java Concurrency in Practice By Brian Goetz, Tim Peierls, Joshua Bloch,...

    数据流Java并行程序设计模型的设计、实现及运行时优.pdf

    数据流Java并行程序设计模型的设计、实现及运行时优 数据流Java并行程序设计模型是指基于数据流多态语言特征设计的一种Java并行程序设计模型。该模型的设计思想源于传统工作中单个处理器的工作性能提升方法的不足。...

    java8并行计算示例--可动态配置

    Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中之一就是并行处理能力的增强,这...在实际开发中,合理使用并行流可以优化代码,提高软件的响应速度,尤其在大数据处理和高性能计算领域有着广泛的应用。

    Java核心技术笔记

    Java核心技术笔记涵盖了许多Java编程的关键知识点,以下是这些主题的详细说明: 1. **面向对象技术**:面向对象编程(OOP)是Java的核心概念。它包括类、对象、封装、继承、多态等核心概念。类是对象的蓝图,定义了...

    基于JAVA平台的多线程与并行的资料

    在Java平台上,多线程和并行计算是两个关键的概念,它们对于开发高效、响应迅速的应用程序至关重要。本文将深入探讨这两个主题,旨在提供全面的知识点解析。 **一、Java多线程** 1. **线程定义**:线程是程序执行...

    并行计算框架的Java实现--系列二

    并行计算框架的Java实现是现代软件开发中的一个重要领域,特别是在大数据处理、机器学习和高性能计算等场景下。本系列的第二部分将深入探讨如何利用Java语言构建并行计算框架,以提高程序的运行效率。在本文中,我们...

    Java共享内存并行编程

    JOMP是一个专为Java设计的共享内存并行编程接口,其目标是为了简化并行编程的复杂性,提高并行程序的开发效率。它借鉴了OpenMP的思想,提供了一系列伪指令和运行库函数,使得程序员可以更轻松地编写并行代码。JOMP由...

Global site tag (gtag.js) - Google Analytics