https://n1tjrgns.tistory.com/292

단순하게 stream은 순차처리, parallelStream은 병렬 처리가 된다.

그럼 무조건 parallelStream을 쓰면 빠를 텐데? 하지만 그러면 안 되는 이유가 있을 것만 같은 느낌적인 느낌 parallelStream도 분명 뭔가가 불편하거나 힘들었기 때문에 나왔을 것이다. 파헤쳐보자.

자바 7 이전의 컬렉션 데이터 병렬 처리 방식

데이터를 서브 파트로 분할 후, 분할된 서브 파트에 따라서 각각의 스레드로 할당한다. 각각의 할당된 스레드에서 **경쟁상태**가 발생하지 않도록 적절한 **동기화**를 해줘야 하며, 마지막으로 부분 결과를 다시 합쳐야 한다.

자바 7 이후의 컬렉션 데이터 병렬 처리 방식

자바 7부터 포크/조인 프레임워크 기능을 제공한다. 또한 자바 8에서는 **스트림**을 사용함으로써 병렬 스트림 처리를 할 수 있다.

포크/조인 프레임워크라는 게 있네? 뭔지는 잘 모르겠지만, 프레임워크이니 복잡한 과정을 줄여줄것만 같다.

1. 포크/조인 프레임워크

병렬화할 수 있는 작업을 재귀적으로 작은 작업으로 분할 후, 서브 태스크의 각각의 결과를 합쳐서 최종 결과를 만든다. 내부적으로 ForkJoinPool이라는 스레드 풀을 사용하며, ExecutorService 인터페이스를 구현한다.

스레드 풀을 이용하기 위해 RecursiveTask의 서브 클래스를 만들고 추상 메소드 compute를 구현해줘야 한다.

protected abstract R compute();

이 메소드는 태스크를 서브 태스크로 분할하는 로직과 더 이상 분할할 수 없을 때 개별 서브 태스크의 결과를 합치는 형식이다. 의사 코드로 나타내면 아래와 같다.

if(태스크가 충분히 작거나 더 이상 분할할 수 없으면){
        순차계산
    }else{
        태스크를 두 서브태스크로 분할
        태스크가 다시 서브태스크로 분할되도록 이 메소드를 재귀적으로 호출
        모든 서브태스크의 연산이 완료될 때까지 기다림
        각 서브태스크의 결과를 합침
    }

분할 정복 알고리즘을 기반으로 한다.

음 그럼 포크/조인 프레임워크를 사용해서 병렬로 처리하면 다 되는 건가??

주의사항