Stream API
Java8에서 도입된 Stream API는 데이터 컬렉션 (List, Set,Map)을 함수형 방식으로 처리하는 도구
- 기본적으로 stream()을 사용하면 데이터 흐름을 선언적으로 조작할 수 있음
- for-loop 없이 간결한 코드로 데이터 변환, 필터링, 매핑 가능
- 불변성 유자 : 원본 데이터를 변경하지 않고 새로운 스트림을 생성하여 처리
- parallelStream()을 활용하면 멀티코어 CPU에서 병렬 처리 가능
Stream api의 주요 특징
- 선언형 프로그래밍 지원
- for-loop없이 stream()으로 데이터 처리 가능
- 중간 연산 지원
- filter(), map(),sorted()등 여러 단계로 데이터 변환 가능
- 최종 연산 지원
- collect(), count(), forEach()등으로 데이터 최종 처리 가능
- 병렬 처리 가능
- 내부적으로 ForkJoinPool을 사용하여 멀티 코어 활용
- Lazy Evaluation (지연 연산) 가능
- stream()은 연산을 정의할 뿐 실행은 최종 연산 시 수행됨
병렬 스트림이란 ?
- java8 에서 도입된 Stream API를 활용한 병렬 처리 기법
- parallelStream()을 사용하면 내부적으로 멀티코어 cpu를 활용하여 데이터를 병렬로 처리
- 내부적으로 ForkJoinPool을 사용하여 작업을 나누어 병렬로 실행
병렬 스트림의 기본 구조
- 순차 스트림은 main 스레드에서 실행되지만, 병렬 스트림은 여러 개의 ForkJoinPool스레드에서 실행됨
ForkJoinPool 이란?
Fork-Join 알고리즘을 활용한 java의 병렬 처리 프레임워크
- 대량 데이터를 작은 작업 단위로 나누고 (Fork)병렬 실행 후 병합(join)하는 방식
- 재귀적 (Task splitting)으로 작업을 분할하여 병렬 연산 가능
- 기본적으로 병렬 스트림에서도 ForkJoinPool 이 사용됨
Fork-Join 알고리즘
- 재궈적으로 작업을 작은 단위로 나누고 (Fork)나뉜 작업을 병렬로 실행한 후 결과를 병합 (Join)
기본 원리
1. 작업을 일정 크기로 분할(Fork)
2. 각 작업을 병렬로 실행
3. 작업이 완료되면 결과를 병합(join)
4. 최종 결과를 반환
병렬 스트림과 ForkJoinPool의 차이점
- 병렬 스트림(parallelStream()
- List.parallelStream() 사용
- 자동 분할
- 컬렉션 대상(List, Set,Map)
- 메소드 체이닝(Map, filter등)가능
- 데이터 변환, 필터링,집계 연산에 적합
- ForkJoinPool
- ForkJoinTask또는 RecursiveTask
- 개발자가 직접 작업을 분할(fork(),join())
- 대량 데이터 처리, 재귀적 연산에 적합