一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Java8 中的ParallelStream

Java8 中的ParallelStream

2022-02-24 13:35onlythinking Java教程

這篇文章主要介紹了Java8 中的并行流 ParallelStreams,Java8并行流ParallelStream和Stream的區(qū)別就是支持并行執(zhí)行,提高程序運(yùn)行效率。下面就來(lái)看看文章內(nèi)容具體介紹吧

前言:

并行編程勢(shì)不可擋,Java從1.7開(kāi)始就提供了Fork/Join 支持并行處理。java1.8 進(jìn)一步加強(qiáng)。

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

Java8 中的ParallelStream

 

1、Stream API

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

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

Java8 中的ParallelStream

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

 

2、ParallelStreams執(zhí)行原理

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

Java8 中的ParallelStream

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

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

 

3、ParallelStreams注意事項(xiàng)

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

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

原因,并行流執(zhí)行時(shí),通過(guò)操作Key來(lái)合并多個(gè)map的操作比較昂貴。詳細(xì)大家可以查看官網(wǎng)介紹。

Java8 中的ParallelStream

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 默認(rèn)使用 ForkJoinPool.commonPool()線程池。

注意:默認(rèn)情況下,你寫(xiě)的 ParallelStreams 都是通過(guò)該線程池調(diào)度執(zhí)行,整個(gè)應(yīng)用程序都共享這個(gè)線程池。

看一個(gè)例子,我們查詢一批新聞數(shù)據(jù),可以利用并行化來(lái)處理遠(yuǎn)程新聞下載。

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

因?yàn)槭蔷W(wǎng)絡(luò)操作,存在很多不確定性,假如某個(gè)任務(wù)運(yùn)行時(shí)間較長(zhǎng),導(dǎo)致線程池資源占據(jù),阻塞其它線程,這樣就阻止了其他的并行流任務(wù)正常進(jìn)行。

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

ForkJoinPool 構(gòu)造參數(shù)我們默認(rèn)設(shè)置為CPU核心數(shù)。

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


總結(jié):

Java 1.8 提供的Stream API簡(jiǎn)化了代碼,很好用。不過(guò)在使用過(guò)程中應(yīng)該注意以上問(wèn)題。

到此這篇關(guān)于Java8 中的并行流 ParallelStreams的文章就介紹到這了,更多相關(guān)Java8 ParallelStreams內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.onlythinking.com/2020/06/05/%E4%BD%A0%E5%9C%A8%E4%BD%BF%E7%94%A8java-8-parallel-streams-%E5%90%97%EF%BC%9F/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美艳教师刘艳第三部166 | 猫咪社区免费资源在线观看 | 青草园网站在线观看 | 亚洲国产精品一区二区久久 | 美女被扣逼 | 黑人巨鞭大战白妞10级 | 欧美日本道免费一区二区三区 | 俺去啦最新地址 | 国产成人久久精品区一区二区 | 美女日b视频 | 午夜理论电影在线观看亚洲 | 国产亚洲欧美一区二区三区 | 无人区乱码区1卡2卡三卡在线 | 公翁的舌尖研磨她的花蒂小说 | 亚洲2卡三卡4卡5卡精品 | 91欧美秘密入口 | 日本不卡免费新一二三区 | 亚洲精品日韩专区在线观看 | 久久中文字幕乱码免费 | 男女真实无遮挡xx00动态图软件 | 嗯啊在线观看免费影院 | 免费日本视频 | 国产精品拍拍拍福利在线观看 | mmkk在线看片| 水蜜桃一二二区视在线 | 国产成人精品777 | 毛茸茸的大逼 | 91香蕉导航| 国产人妖ts在线视频网 | 国产精品成人一区二区1 | 国产无限 | 精品国产欧美一区二区三区成人 | 日韩欧美精品一区二区 | 97菊爱网 | 5151hh四虎国产精品 | 免费国产白棉袜踩踏区域 | av72成人| 精品推荐国产麻豆剧传媒 | 男人与雌性宠物交啪啪小说 | 亚洲精品久久久久69影院 | 国产香蕉一区二区精品视频 |