Java 并行流(parallelStream)的具體使用小結(jié)
1. 什么是 parallelStream?
在 Java 8 中,Stream API 提供了 stream() 和 parallelStream() 兩種流處理方式。
stream()采用順序流處理數(shù)據(jù),每個(gè)元素按照流的順序依次處理。parallelStream()采用并行流處理數(shù)據(jù),利用ForkJoinPool并發(fā)執(zhí)行,提高處理效率。
2. parallelStream 的優(yōu)勢(shì)
- 充分利用多核 CPU:并行流會(huì)將任務(wù)拆分為多個(gè)子任務(wù),并分配到多個(gè) CPU 核心執(zhí)行。
- 提升處理速度:適用于計(jì)算密集型任務(wù),能明顯提高大數(shù)據(jù)量的處理效率。
- API 友好:
parallelStream()的使用方式與stream()類似,開發(fā)成本較低。
3. parallelStream 的使用
3.1 基本使用
import java.util.Arrays;
import java.util.List;
public class ParallelStreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "D", "E", "F");
// 使用并行流處理數(shù)據(jù)
list.parallelStream().forEach(System.out::println);
}
}
注意:并行流的輸出順序是無序的,因?yàn)槎鄠€(gè)線程并發(fā)執(zhí)行。
3.2 計(jì)算總和示例
import java.util.stream.IntStream;
public class ParallelSum {
public static void main(String[] args) {
int sum = IntStream.rangeClosed(1, 100)
.parallel()
.sum();
System.out.println("Sum: " + sum);
}
}
3.3 結(jié)合groupingByConcurrent實(shí)現(xiàn)線程安全的分組操作
- 使用parallelStream將分組過程并行化提升效率,使用
groupingByConcurrent及ConcurrentMap避免出現(xiàn)線程安全的問題
Map<String, List<CourseGrade>> collect = courseGrades .parallelStream() .collect(Collectors.groupingByConcurrent(CourseGrade::getYear));
4. parallelStream 的注意事項(xiàng)
4.1 適用場(chǎng)景
| 適用場(chǎng)景 | 不適用場(chǎng)景 |
|---|---|
| 數(shù)據(jù)量大 | 數(shù)據(jù)量小 |
| 計(jì)算密集型任務(wù) | IO 密集型任務(wù) |
| 不關(guān)心執(zhí)行順序 | 需要嚴(yán)格順序執(zhí)行 |
| 需要提升性能 | 線程切換成本高 |
4.2 并行流的局限性
- 線程開銷:并行流會(huì)使用
ForkJoinPool線程池,線程的創(chuàng)建和切換會(huì)帶來一定的開銷。 - 數(shù)據(jù)競(jìng)爭(zhēng):如果流操作涉及共享變量,可能會(huì)出現(xiàn)線程安全問題。
- 不適合小數(shù)據(jù)量:并行執(zhí)行存在一定的啟動(dòng)成本,數(shù)據(jù)量太小可能會(huì)降低性能。
5. 控制并行流線程數(shù)
默認(rèn)情況下,parallelStream() 使用 ForkJoinPool 的公共線程池,線程數(shù)與 CPU 核心數(shù)相同。
如果需要自定義線程池大小,可以使用以下方式:
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
public class CustomParallelStream {
public static void main(String[] args) {
ForkJoinPool customPool = new ForkJoinPool(4); // 設(shè)置 4 個(gè)線程
customPool.submit(() ->
System.out.println(IntStream.range(1, 100)
.parallel()
.sum())
).join();
customPool.shutdown();
}
}
6. 總結(jié)
parallelStream()能有效提高大數(shù)據(jù)量的處理效率。- 適用于計(jì)算密集型任務(wù),但可能不適用于 IO 密集型任務(wù)。
- 默認(rèn)使用
ForkJoinPool,可以自定義線程池大小。 - 需謹(jǐn)慎使用,避免線程安全問題和不必要的開銷。
到此這篇關(guān)于Java 并行流(parallelStream)的具體使用小結(jié)的文章就介紹到這了,更多相關(guān)Java 并行流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成nacos動(dòng)態(tài)刷新數(shù)據(jù)源的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot集成nacos動(dòng)態(tài)刷新數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
java實(shí)現(xiàn)Excel轉(zhuǎn)換為圖片
在實(shí)際開發(fā)過程中,經(jīng)常會(huì)有這樣的需求,需要將Excel表格或特定區(qū)域轉(zhuǎn)換為圖片,所以小編今天就來為大家介紹一下如何使用Java將Excel轉(zhuǎn)化為圖片吧2023-10-10
java中xml進(jìn)行報(bào)文發(fā)送和解析操作
這篇文章主要介紹了java中xml進(jìn)行報(bào)文發(fā)送和解析操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
springsecurity中http.permitall與web.ignoring的區(qū)別說明
這篇文章主要介紹了springsecurity中http.permitall與web.ignoring的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring?Boot2升級(jí)到3的詳細(xì)步驟記錄
從Spring Boot 2到Spring Boot 3的升級(jí)是一次全面而深刻的變革,它不僅帶來了技術(shù)棧的更新和新特性的引入,還顯著提升了應(yīng)用的性能和開發(fā)效率,這篇文章主要介紹了Spring?Boot2升級(jí)到3的詳細(xì)步驟,需要的朋友可以參考下2025-08-08
Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java接口方法默認(rèn)靜態(tài)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
SpringBoot雪花算法主鍵ID傳到前端后精度丟失問題的解決
本文主要介紹了SpringBoot雪花算法主鍵ID傳到前端后精度丟失問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
把Jar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄袹ar文件轉(zhuǎn)成exe安裝文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析
這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

