欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8 中的ParallelStream

 更新時間:2021年10月22日 16:43:21   作者:onlythinking  
這篇文章主要介紹了Java8 中的并行流 ParallelStreams,Java8并行流ParallelStream和Stream的區(qū)別就是支持并行執(zhí)行,提高程序運行效率。下面就來看看文章內容具體介紹吧

前言:

并行編程勢不可擋,Java從1.7開始就提供了Fork/Join 支持并行處理。java1.8 進一步加強。

并行處理就是將任務拆分子任務,分發(fā)給多個處理器同時處理,之后合并。

1、Stream API

Java 8 引入了許多特性,Stream API是其中重要的一部分。區(qū)別 InputStream OutputStream,Stream API 是處理對象流而不是字節(jié)流。

執(zhí)行原理如下,流分串行和并行兩種執(zhí)行方式

// 串行執(zhí)行流
stream().filter(e -> e > 10).count();
// 并行執(zhí)行流
.parallelStream().filter(e -> e > 10).count()

2、ParallelStreams執(zhí)行原理

并行執(zhí)行時,java將流劃分為多個子流,分散在不同CPU并行處理,然后進行合并。

并行一定比串行更快嗎?這不一定,取決于兩方面條件:

  • 處理器核心數量,并行處理核心數越多自然處理效率會更高。
  • 處理的數據量越大,優(yōu)勢越強。這也很好理解,比如十個人干一個人就能完成的活兒會比它自己干更便宜?

3、ParallelStreams注意事項

使用并行流時,不要使用collectors.groupingBy,collectors.toMap,替代為

collectors.groupingByConcurrent , collectors.toConcurrentMap,或直接使用串行流。

原因,并行流執(zhí)行時,通過操作Key來合并多個map的操作比較昂貴。詳細大家可以查看官網介紹。

https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#concurrent_reduction

Map<String, List<Person>> byGender = 
  roster
   .stream()
   .collect(Collectors.groupingBy(Person::getGender));

ConcurrentMap<String, List<Person>> byGender =         
  roster
   .parallelStream()
   .collect(Collectors.groupingByConcurrent(Person::getGender));

ParallelStreams 默認使用 ForkJoinPool.commonPool()線程池。

注意:默認情況下,你寫的 ParallelStreams 都是通過該線程池調度執(zhí)行,整個應用程序都共享這個線程池。

看一個例子,我們查詢一批新聞數據,可以利用并行化來處理遠程新聞下載。

public List<News> queryNews(Stream<String> ids) {
     return ids.parallel()
            .map(this::getNews) // 網絡操作,新聞下載
            .collect(toList());
}

因為是網絡操作,存在很多不確定性,假如某個任務運行時間較長,導致線程池資源占據,阻塞其它線程,這樣就阻止了其他的并行流任務正常進行。

如果解決這個問題的其中一種方式,進行線程池隔離。那么如何自定義并行流的線程池呢?

ForkJoinPool 構造參數我們默認設置為CPU核心數。

ForkJoinPool customThreadPool = new ForkJoinPool(4);
long actualTotal = customThreadPool
  .submit(() -> roster.parallelStream().reduce(0, Integer::sum)).get();


總結:

Java 1.8 提供的Stream API簡化了代碼,很好用。不過在使用過程中應該注意以上問題。

到此這篇關于Java8 中的并行流 ParallelStreams的文章就介紹到這了,更多相關Java8 ParallelStreams內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis?Generator生成數據庫模型實現示例

    MyBatis?Generator生成數據庫模型實現示例

    這篇文章主要為大家介紹了MyBatis?Generator生成數據庫模型實現示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 一文解決System.in關閉后無法再繼續(xù)使用流的問題

    一文解決System.in關閉后無法再繼續(xù)使用流的問題

    這篇文章主要給大家介紹如何解決System.in關閉后無法再繼續(xù)使用流的問題,文中有詳細的解決方法和代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-07-07
  • 解決springboot中自定義JavaBean返回的json對象屬性名稱大寫變小寫問題

    解決springboot中自定義JavaBean返回的json對象屬性名稱大寫變小寫問題

    開發(fā)過程中發(fā)現查詢返回的數據出現自定義的JavaBean的屬性值大小寫格式出現問題,導致前端無法接受到數據,目前有四種解決方法,根據大佬的經驗之談,前兩種是最簡單便捷的,后兩種是比較通用的方法,需要的朋友可以參考下
    2023-10-10
  • java 實現將Object類型轉換為int類型

    java 實現將Object類型轉換為int類型

    這篇文章主要介紹了java 實現將Object類型轉換為int類型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring?Boot源碼實現StopWatch優(yōu)雅統(tǒng)計耗時

    Spring?Boot源碼實現StopWatch優(yōu)雅統(tǒng)計耗時

    這篇文章主要為大家介紹了Spring?Boot源碼實現StopWatch優(yōu)雅統(tǒng)計耗時,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java源碼解析之平衡二叉樹

    Java源碼解析之平衡二叉樹

    在上一章的文章中,我們講到了二叉排序樹,它很好的平衡了插入與查找的效率,但二叉排序樹如果不平衡,那么查找效率就會大大降低,今天要講的這個平衡二叉樹就是一種解決這個問題的方法.需要的朋友可以參考下
    2021-05-05
  • IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題

    IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題

    這篇文章主要介紹了IDEA全量替換一次性解決舊項目并將所有文件換行符改為LF問題,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下
    2019-05-05
  • java中Class.forName方法的作用詳解

    java中Class.forName方法的作用詳解

    Class.forName(xxx.xx.xx) 返回的是一個類,但Class.forName方法的作用到底是什么終?下面這篇文章就來給大家詳細介紹了關于java中Class.forName方法的作用,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • Java Arrays.asList使用方法解析

    Java Arrays.asList使用方法解析

    這篇文章主要介紹了Java Arrays.asList使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot?整合Thymeleaf教程及使用方法

    SpringBoot?整合Thymeleaf教程及使用方法

    Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內容的模板引擎,它與?JSP,Velocity,FreeMaker?等模板引擎類似,也可以輕易地與?Spring?MVC?等?Web?框架集成,這篇文章主要介紹了SpringBoot?整合Thymeleaf教程及使用,需要的朋友可以參考下
    2023-11-11

最新評論