백엔드 개발 블로그
Java Stream 병렬로 실행하기 본문
기본
List<MyResult> results = inputList.parallelStream()
.map(this::doSomeProcessing)
.collect(Collectors.toList());
parallelStream()
을 중간에 하나 넣어주기만 하여도 자동으로 병렬 실행된다.- 이 때 실제 병렬 처리에 사용되는 pool은 전역으로 공유하는 공유 ForkJoinPool이다.
- 기본적으로 pool size는
CPU 코어 수 - 1
이다.- 그렇다고 CPU 코어를 다 안쓰는 것은 아니다. 병렬 처리 시에 Main 쓰레드도 거든다. 따라서 전체 코어를 사용한다.
- 참고 Medium 게시글
java.util.concurrent.ForkJoinPool.common.parallelism
환경 변수를 수정하여 기본 common pool의 사이즈를 변경할 수 있다.
ForkJoinPool을 이용해 pool size 커스터마이징
ForkJoinPool forkJoinPool = new ForkJoinPool(poolSize);
List<MyResult> results = forkJoinPool.submit(() -> inputList.parallelStream()
.map(this::doSomeProcessing)
.collect(Collectors.toList())).get();
- 따로 만든 ForkJoinPool에 병렬 스트림 관련 runnable / function을 submit하여 실행하면 원하는 pool size가 적용된다.
- Task를 따로 나누어서 submit한 것도 아니고 통짜 function을 넣었는데도 어떻게 작동하는 건지 궁금했는데
- ForkJoinPool의 작동 방식 때문이라고 한다. (ForkJoinPool task 내에서 ForkJoinPool이 사용될 때에는 원래 pool을 그대로 사용한다.)
'Java' 카테고리의 다른 글
[Java] Java 가상 스레드 (Virtual Thread) (1) | 2023.11.11 |
---|
Comments