[java] parallel() 메서드를 이용한 병렬 스트림 생성 방법

자바 8부터는 스트림(Stream) API를 통해 데이터를 처리할 수 있게 되었습니다. 스트림은 데이터의 시퀀스를 표현하는 것이며, 데이터를 처리하는 연산을 수행할 수 있습니다. 병렬 스트림은 이러한 연산을 병렬로 처리하여 성능을 향상시킬 수 있습니다.

병렬 스트림 생성

자바 스트림은 sequential() 메서드를 사용하여 순차적인 스트림을 생성할 수 있습니다. 또한 parallel() 메서드를 사용하여 병렬 스트림을 생성할 수도 있습니다. parallel() 메서드는 스트림의 소스를 분할하여 병렬 처리를 수행합니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> sequentialStream = numbers.stream().sequential();
Stream<Integer> parallelStream = numbers.stream().parallel();

위의 예제에서는 numbers라는 리스트를 기반으로 스트림을 생성합니다. sequential() 메서드는 명시적으로 순차적인 스트림을 생성하고, parallel() 메서드는 병렬 스트림을 생성합니다.

병렬 스트림 사용하기

병렬 스트림을 사용하면 여러 스레드를 동시에 사용하여 연산을 수행할 수 있습니다. 이를 통해 대용량 데이터를 빠르게 처리할 수 있습니다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

int sum = numbers.stream()
                .parallel()  // 병렬 스트림으로 변환
                .filter(n -> n % 2 == 0)  // 짝수만 필터링
                .mapToInt(Integer::intValue)  // int 타입으로 변환
                .sum();  // 합계 계산

위의 예제에서는 numbers 리스트를 기반으로 병렬 스트림을 생성합니다. filter() 메서드를 사용하여 짝수만 필터링하고, mapToInt() 메서드를 사용하여 int 타입으로 변환합니다. 최종적으로 sum() 메서드를 사용하여 합계를 계산합니다.

주의사항

병렬 스트림을 사용할 때에는 몇 가지 주의사항이 있습니다. 병렬 스트림은 내부적으로 멀티스레딩을 사용하기 때문에 스레드-safe하지 않은 코드를 사용하면 예기치 않은 결과가 발생할 수 있습니다. 따라서 스트림 연산에서 변경 가능한 상태를 피하고, 상태를 공유하지 않는 방법을 사용해야 합니다.

또한, 병렬 스트림을 사용해야만 성능이 향상되는 것은 아닙니다. 작업량이 적거나 스트림의 소스가 순차적으로 처리할 수 있는 작은 크기의 데이터인 경우에는 순차 스트림이 더 효율적일 수 있습니다. 따라서 병렬 스트림을 사용하기 전에 신중하게 고려하는 것이 중요합니다.

결론

Java 8에서 제공하는 parallel() 메서드를 사용하여 병렬 스트림을 생성하고, 멀티스레딩을 통해 데이터 처리 성능을 향상시킬 수 있습니다. 병렬 스트림을 사용할 때에는 스레드-safe한 코드를 작성하고, 작업량과 데이터 크기에 맞는 최적의 스트림을 선택하는 것이 중요합니다.