关于页面渲染的不同操作解析:
问题:一般地,对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并行计算的相关知识点。 1. **Java多线程基础**:Java并行计算的核心在于多线程技术。Java提供了...
### 基于Web的Java并行计算 #### 摘要 本文深入探讨了如何运用Java技术在Web环境中执行并行数据处理程序的关键问题。文章首先介绍了基于Web的Java并行计算的基本概念及其背景,随后详细分析了利用Java进行Web上...
JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式JAVA并行模式
Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...
Java 并行编程是利用多核处理器或者分布式计算资源来提高程序执行效率的重要技术。在Java 1.7版本中,引入了一套强大的并行框架,使得开发者能够更方便地编写出高效、可扩展的并发应用程序。这个压缩包文件...
### Java并行机制的核心知识点解析 #### 一、Java并发机制概述 Java作为一种广泛应用的编程语言,自诞生之初就内置了关键的并发概念,如线程(Thread)和锁(Lock)。随着多核处理器的普及以及对高性能计算的需求...
Java并行排序(Parallel Sort)是Java集合框架中提供的一种高效的数据排序方法,它利用了多核处理器的优势,通过并行处理技术来提高排序的速度。在这个经典例子中,我们将深入探讨Java并行排序的工作原理、实现方式...
Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中并行计算是其一大亮点。本示例通过利用Java 8的并行流(Parallel Stream)特性,显著提升了计算效率,具体体现在对1到400亿数列求和的问题上。传统顺序...
【标题】:“Java 并行爬取网页” 在Java编程中,实现并行爬取网页是一种提高效率的有效方法。这通常涉及到多线程或者更高级的并发机制,如Fork/Join框架。在这个项目中,开发者在Eclipse集成开发环境中编写了一个...
在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并行编程>>英文版chm格式,英文名称<Java Concurrency in Practice>,一直想买这本书,但总是缺货,找到了电子版,分享给大家。 Java Concurrency in Practice By Brian Goetz, Tim Peierls, Joshua Bloch,...
数据流Java并行程序设计模型的设计、实现及运行时优 数据流Java并行程序设计模型是指基于数据流多态语言特征设计的一种Java并行程序设计模型。该模型的设计思想源于传统工作中单个处理器的工作性能提升方法的不足。...
Java 8 是一个重要的 Java 发行版本,引入了许多新特性,其中之一就是并行处理能力的增强,这...在实际开发中,合理使用并行流可以优化代码,提高软件的响应速度,尤其在大数据处理和高性能计算领域有着广泛的应用。
Java核心技术笔记涵盖了许多Java编程的关键知识点,以下是这些主题的详细说明: 1. **面向对象技术**:面向对象编程(OOP)是Java的核心概念。它包括类、对象、封装、继承、多态等核心概念。类是对象的蓝图,定义了...
Java并行注释规范JAC的扩展 Java并行注释规范JAC是基于扩展Java注释来描述并行编程的技术,具有隐藏线程、同步等并行编程机制,把应用逻辑与并行逻辑分离等优点。然而,在执行类静态方法对象间的并行时,可能会造成...
在Java平台上,多线程和并行计算是两个关键的概念,它们对于开发高效、响应迅速的应用程序至关重要。本文将深入探讨这两个主题,旨在提供全面的知识点解析。 **一、Java多线程** 1. **线程定义**:线程是程序执行...
并行计算框架的Java实现是现代软件开发中的一个重要领域,特别是在大数据处理、机器学习和高性能计算等场景下。本系列的第二部分将深入探讨如何利用Java语言构建并行计算框架,以提高程序的运行效率。在本文中,我们...