JAVA · 컬렉션
병렬 스트림
parallelStream()의 동작 원리, 성능 주의사항, 적합한 사용 시나리오입니다.
컬렉션고급parallelStream병렬ForkJoinPool성능
핵심 설명
parallelStream()의 동작 원리, 성능 주의사항, 적합한 사용 시나리오입니다.
Java code
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;
public class ParallelStreamDemo {
public static void main(String[] args) {
List<Integer> numbers = IntStream.rangeClosed(1, 1_000_000)
.boxed().toList();
// 순차 vs 병렬
long start = System.nanoTime();
long seqSum = numbers.stream()
.mapToLong(Integer::longValue).sum();
long seqTime = System.nanoTime() - start;
start = System.nanoTime();
long parSum = numbers.parallelStream()
.mapToLong(Integer::longValue).sum();
long parTime = System.nanoTime() - start;
System.out.printf("순차: %dns, 병렬: %dns%n", seqTime, parTime);
// 병렬이 유리한 경우: CPU 집약적 작업
List<Double> results = numbers.parallelStream()
.map(n -> Math.sqrt(n) * Math.log(n))
.toList();
// 커스텀 ForkJoinPool 사용 (공유 풀 분리)
ForkJoinPool customPool = new ForkJoinPool(4);
try {
long result = customPool.submit(() ->
numbers.parallelStream()
.mapToLong(n -> (long) n * n)
.sum()
).get();
System.out.println("커스텀 풀 결과: " + result);
} catch (Exception e) {
e.printStackTrace();
} finally {
customPool.shutdown();
}
}
}학습 팁
병렬 스트림은 기본적으로 ForkJoinPool.commonPool()을 사용합니다. I/O 작업이 포함되면 커스텀 풀을 사용하세요.
주의할 점
병렬 스트림에서 공유 가변 상태를 수정하면 경쟁 조건이 발생합니다. forEach에서 외부 리스트에 add하지 마세요.
자주 묻는 질문
병렬 스트림란 무엇인가요?
parallelStream() 의 동작 원리, 성능 주의사항, 적합한 사용 시나리오입니다.
병렬 스트림 학습 시 주의할 점은 무엇인가요?
병렬 스트림에서 공유 가변 상태를 수정하면 경쟁 조건이 발생합니다. forEach 에서 외부 리스트에 add 하지 마세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.