자바 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한 코드를 작성하고, 작업량과 데이터 크기에 맞는 최적의 스트림을 선택하는 것이 중요합니다.