Java 并行流(parallelStream)的具體使用小結(jié)
1. 什么是 parallelStream?
在 Java 8 中,Stream API 提供了 stream() 和 parallelStream() 兩種流處理方式。
stream()采用順序流處理數(shù)據(jù),每個元素按照流的順序依次處理。parallelStream()采用并行流處理數(shù)據(jù),利用ForkJoinPool并發(fā)執(zhí)行,提高處理效率。
2. parallelStream 的優(yōu)勢
- 充分利用多核 CPU:并行流會將任務(wù)拆分為多個子任務(wù),并分配到多個 CPU 核心執(zhí)行。
- 提升處理速度:適用于計算密集型任務(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);
}
}
注意:并行流的輸出順序是無序的,因為多個線程并發(fā)執(zhí)行。
3.2 計算總和示例
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實現(xiàn)線程安全的分組操作
- 使用parallelStream將分組過程并行化提升效率,使用
groupingByConcurrent及ConcurrentMap避免出現(xiàn)線程安全的問題
Map<String, List<CourseGrade>> collect = courseGrades .parallelStream() .collect(Collectors.groupingByConcurrent(CourseGrade::getYear));
4. parallelStream 的注意事項
4.1 適用場景
| 適用場景 | 不適用場景 |
|---|---|
| 數(shù)據(jù)量大 | 數(shù)據(jù)量小 |
| 計算密集型任務(wù) | IO 密集型任務(wù) |
| 不關(guān)心執(zhí)行順序 | 需要嚴格順序執(zhí)行 |
| 需要提升性能 | 線程切換成本高 |
4.2 并行流的局限性
- 線程開銷:并行流會使用
ForkJoinPool線程池,線程的創(chuàng)建和切換會帶來一定的開銷。 - 數(shù)據(jù)競爭:如果流操作涉及共享變量,可能會出現(xiàn)線程安全問題。
- 不適合小數(shù)據(jù)量:并行執(zhí)行存在一定的啟動成本,數(shù)據(jù)量太小可能會降低性能。
5. 控制并行流線程數(shù)
默認情況下,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 個線程
customPool.submit(() ->
System.out.println(IntStream.range(1, 100)
.parallel()
.sum())
).join();
customPool.shutdown();
}
}
6. 總結(jié)
parallelStream()能有效提高大數(shù)據(jù)量的處理效率。- 適用于計算密集型任務(wù),但可能不適用于 IO 密集型任務(wù)。
- 默認使用
ForkJoinPool,可以自定義線程池大小。 - 需謹慎使用,避免線程安全問題和不必要的開銷。
到此這篇關(guān)于Java 并行流(parallelStream)的具體使用小結(jié)的文章就介紹到這了,更多相關(guān)Java 并行流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java求解從1到20的階乘之和(1+ 2! + 3! + ...
在編程中,計算階乘是一個常見的問題,階乘(Factorial)通常表示為 ??n!??,定義為所有小于及等于該數(shù)的正整數(shù)的乘積,本文將介紹如何使用Java語言來求解從1到20的階乘之和,即 ??1 + 2! + 3! + ... + 20!??,需要的朋友可以參考下2026-01-01
java調(diào)用python代碼的兩種實現(xiàn)方式:Runtime.exec()和Jython
在Java中調(diào)用Python代碼有多種方法,包括使用Runtime.exec()和第三方庫如Jython,Runtime.exec()通過系統(tǒng)命令執(zhí)行Python腳本,適用于簡單的調(diào)用場景,Jython則是一個Python的Java實現(xiàn),允許在Java中直接運行Python代碼,適用于更深層次的集成需求2025-01-01
JAVA 泛型與通配符詳解從原理到實戰(zhàn)應(yīng)用
本章全面介紹了泛型的核心概念、設(shè)計初衷及三大使用方式(泛型類、泛型接口、泛型方法),重點講解了泛型的擦除機制和通配符的靈活運用,強調(diào)了泛型在編譯期類型安全和運行時類型擦除的優(yōu)勢,感興趣的朋友跟隨小編一起看看吧2026-03-03

