java并发策略_Java并发(六):并发策略

通过多次优化实例来了解选择并发策略的正确姿势

通过模拟浏览器程序的渲染页面(Page-Rendering)功能,为了方便,假设HTML页面只会包含标签文本和图片以及URL;

第一个版本:串行加载页面元素

public classSingleThreadRenderer{voidrenderPage(CharSequence source){

renderText(Source);

List imageData = new ArrayList();for(ImageInfo imageInfo : scanForImageInfo(source))

imageData.add(imageInfo.downloadImage());for(ImageData data : ImageData)

renderImage(data);

}

}

存在的问题:浏览器加载图片之前需要下载图片,此时如果存在网络拥塞,那么此时的CPU几乎没怎么用,大都在等待I/O操作执行完成,也会使用户体验降低:图片没下载完,文字就加载不出来;

改进版本1:使用Future实现页面渲染

/***@authorYHW

* @ClassName: FutureRenderer

* @Description:

* @date 2019/3/28 16:21*/

public classFutureRenderer {privateExecutorService executor ;voidrenderPage(CharSequence source){final List imageInfos =scanForImageInfo(source);

Callable> task = new Callable>(){public Listcall(){

List result = new ArrayList();for(ImageInfo imageInfo : imageInfos)

result.add(imageInfo.downloadImage());returnresult;

}

};

Future> future =executor.submit(task);

renderText(source);try{

List imageData =future.get();for(ImageData data : imageData){

renderImage(data);

}

}catch(InterruptedException e){

Thread.currentThread().interrupt();

future.cancel(true);

}catch(ExecutionException e){throwlaunderThrowable(e.getCause());

}

}

}

该版本使得页面文本和图片实现异步加载,但还有可以优化的地方,假设渲染文本的速度远大于图片的下载速度(很有可能),那么该版本与串行程序最后的性能差别不大,所以此改进方法对于性能的提升非常有限,而代码却更加复杂,其实在大量相互独立且同构的任务可以并发进行处理时,才能体现出将程序的负载分配带来真正的性能提升;

改进版本2:使用完成服务(CompletionService),其基于Executor和BlockingQueue,可以将Callable任务交给它来执行,再使用类似队列的出队操作来获取结果:

public classRenderer {private finalExecutorService executor;

Renderer(ExecutorService executor){this.executor =executor; }voidrevderPage(Charquence source){

List info =scanForImageInfo(source);

CompletionService completionService = new ExecutorComplementService(executor);for(finalImageInfo imageInfo : info)

completionService.submit(new Callable(){publicImageData call(){returnimageInfo.downloadImage();

}

});

renderText(source);try{for(int t = 0, n = info.size(); t < n; t++){

Future f =completionService.take():

ImageData imageData=f.get();

renderImage(imageData);

}

}catch(InterruptedException e){

Thread。currentThread().interrupt();

}catch(ExecutionException e){throwlaunderThrowbale(e.getCause());

}

}

}

经过第二次的改进,页面更加“响应式”,每个图片都会在下载完成后直接加载渲染至页面,同时异步加载HTML中的文本和URL,使用户获得更加动态的界面;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值