병렬 스트림

sungs·2025년 9월 7일

자바

목록 보기
94/95

스트림에서도 병렬적으로 작업을 처리할 수 있개 해주는 메서드가 있다. 바로 parallel()이다. 이를 사용하면 ForkJoin 공유풀을 사용해서 작업을 병렬적으로 처리해 준다.

import java.util.stream.LongStream;

public class ParallelStreamPerformance {

    public static void main(String[] args) {
        long limit = 100_000_000L; // 1억

        // 1. 일반 스트림 (순차 처리)
        long startTime1 = System.currentTimeMillis();

        long oddCount1 = LongStream.rangeClosed(1, limit)
                                   .filter(n -> n % 2 != 0)
                                   .count();

        long endTime1 = System.currentTimeMillis();
        System.out.println("--- 일반 스트림 (순차 처리) ---");
        System.out.println("홀수 개수: " + oddCount1);
        System.out.println("처리 시간: " + (endTime1 - startTime1) + " ms\n");


        // 2. stream().parallel() 병렬 스트림 (동시 처리)
        long startTime2 = System.currentTimeMillis();

        long oddCount2 = LongStream.rangeClosed(1, limit)
                                   .parallel() // ✨ 이 부분이 스트림을 병렬로 전환합니다.
                                   .filter(n -> n % 2 != 0)
                                   .count();

        long endTime2 = System.currentTimeMillis();
        System.out.println("--- parallel() 병렬 스트림 ---");
        System.out.println("홀수 개수: " + oddCount2);
        System.out.println("처리 시간: " + (endTime2 - startTime2) + " ms");
    }
}

parallel()로 선언해주고 그 밑에 로직만 써주면 공유풀에 작업을 제출해 알아서 병렬적으로 처리해준다. 평소보다 작업을 빠르게 처리함과 동시에 코드도 훨씬 줄어든다.

이렇게만 보면 정말 편하게 작업을 병렬적으로 처리할 수 있는 것 같지만, 이 병렬 스트림은 cpu 바운드 작업, 즉 계산 집중적인 작업에만 사용해야 한다. 왜냐하면 공유풀의 특성 때문이다. 공유풀은 애플리케이션 내에서 여러 스레드가 접근할 수 있기 때문에 I/O바운드 작업 같이 스레드가 대기해야 하는 작업이나 동시에 요청할 게 많은 작업을 처리하게 되면 한 작업을 처리할 동안 다른 작업을 처리하지 못하고 밀리게 된다. 공유풀에서 사용하는 스레드 수가 cpu 코어 수의 1개보다 적은 수로 맞춰져 있어서 발생하는 문제점이다. 한 작업에서 공유풀의 스레드를 다 가져가버리면 다른 스레드의 작업은 공유풀을 사용하지 못하고 대기하게 되는 것이다. 게다가 컨텍스트 스위치 비용 증가, 성능 오버헤드 등 여러 문제가 발생한다. 따라서 병렬 스트림은 cpu바운드 작업에만 사용해야 한다. I/O바운드 작업 같은 경우에는 따로 특정 스레드 풀을 생성해주는 게 좋다.

참고로 실무에서는 백엔드는 주로 I/O 바운드 작업을 처리해야할 일이 많으므로 병렬 스트림을 사용해야할 일이 그리 많지 않다.

profile
앱 개발 공부 중

0개의 댓글