日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/4/16 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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并发(六):并发策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。