PHpullh
학습 라이브러리/Java/병렬 스트림

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 하지 마세요.