스트림을 사용하면 병렬로 작업을 간편하게 할 수 있습니다.
동기화, 스레드, 생성 등 어떤것도 신경쓸 필요가 없습니다.
기존 스트림
public long sequentialSum(long n) {
return Stream.iterate(1L, i -> i + 1)
.limit(n)
.reduce(0L, Long::sum);
}
병렬 스트림
public long parallelSum(long n) {
return Stream.iterate(1L, i -> i + 1)
.limit(n)
.parallel()
.reduce(0L, Long::sum);
}
간단히 parallel()만 호출하면 스트림이 알아서 병렬 처리해 줍니다!
반대로 sequential() 메서드는 병렬 스트림을 순차 스트림으로 바꾸는 함수입니다.
병렬 스트림에서 사용하는 스레드 풀 설정
스트림의 parallel 메서드의 병렬작업 스레드는 내부적으로 ForkJoinPool을사용합니다.
ForkJoinPool은 나중에 배울것이니 간단하게만 알아보겠습니다.
기본적으로 ForkJoinPool은 프로세서 수, 즉 Runtime.getRuntime().availableProcessors()가
반환하는 값에 상응하는 스레드를 사용합니다.
Fork/Join Framework의 work Thread의 수는 서비스가 돌아가는 서버의 CPU 코어 수에 종속됩니다. 즉 개인 PC에서 돌렸을 때 4Core PC라면 thread는 4개로 작업을 진행합니다.
Java에서는 Runtime.getRuntime().availableProcessors()으로 CPU Core 숫자가 확인 가능합니다.
하지만!
병렬 스트림을 실전에서 사용하면 스레드 풀에 스레드가 남아나지 않아 요청들이 Thread Pool Queue에 쌓이게 되며 일정치 이상이 되면 요청이 drop 되는 현상까지 발생하게 됩니다.
이러한 문제는 커스텀 ForkJoinPool을 구현해 해결할 수 있습니다.
마무리
오늘은 모던 자바 인 액션책을 읽으며 병렬 스트림에대해 알아보았습니다.
감사합니다.
참조
'Books > Modern Java In Action' 카테고리의 다른 글
[모던 자바 인 액션] Chapter5. 함수형 데이터 처리 (0) | 2023.07.31 |
---|---|
[모던 자바 인 액션] Chapter4. 스트림 vs 컬렉션 (0) | 2023.07.26 |
[모던 자바 인 액션] Chapter4. 스트림 소개 (0) | 2023.07.26 |
[모던 자바 인 액션] Chapter3. 람다 표현식 (0) | 2023.07.25 |
[모던 자바 인 액션] Chapter3. 동작파라미터화 코드 전달하기 (0) | 2023.07.22 |