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,使用戶獲得更加動態的界面;
總結
以上是生活随笔為你收集整理的java并发策略_Java并发(六):并发策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java多线程共享信息_java多线程信
- 下一篇: ig信息增益 java_文本分类综述