ForkJoinPool

Circlee7
3 min readDec 11, 2017

--

java 7에 추가된 forkJoinPool 에 대해 알아보자

관심을 가진 계기는 Java8 Collection의 Parallel Stream 때문이다.

ForkJoinPool 은
하나의 작업 큐를 가지고 있으며 , 이러한 작업들을 ForkJoinPool에서 관리하는 여러 스레드에서 접근하여 작업들을 처리한다.

서로 작업을 하려고 큐에서 작업들을 가져가며,
각 스레드들은 부모 큐에서 가져간 작업들을 내부 큐에 담아 관리한다.

스레드들은 서로의 큐에 접근하여 작업들을 가져가 처리한다.
이러한 방법들은 놀고 있는 스레드가 없도록 하기위해 도입되었다.

위의 그림 처럼
스레드들이 관리하는 큐는 Dequeue이기 때문에 B스레드에서
A스레드의 작업을 빼간다.

부모 작업은 Task를 분할하여 fork 함으로써 자식 스레드에서 처리되며,
join을 통해 포함된다.

Java에서 ForkJoinPool에서 처리하는 FortJoinTask의 추상클래스가 제공된다.

RecursiveAction

RecursiveTask

RecursiveAction의 경우 리턴이 없는 작업이고,
RecursiveTask의 경우 리턴이 존재한다.

ForkJoinTask들은 내부적으로 작업을 분할 Fork하여 작업처리하고 Join 하여 합친다. -_- 분할정복 방식인가..

RecursiveAction에 활용 예는 아래와 같다.

처리할 list 사이즈가 3보다 클 경우 반으로 나눠 작업을 만들고 fork한다.

RecursiveTask는 fork후에 join을 통해 리턴값을 전달받을 수 있겠다.

동일한 시간동안 처리되는 작업들은 ForkJoin방식이 아니더라도
일반 스레드풀을 이용하는게 더 효율적이다.

처리 시간이 동일하기 때문에 노는 스레드가 존재하지 않기 때문이다.
반면에 FortJoin방식으로는 각 로컬 큐 등의 불필요한 객체가 생성된다.

ForkJoin방식의 장점은 위에서 정리된것 처럼 , 노는 스레드가 다른 스레드의 작업을 가져와 처리할수 있다는 것이다.

참고 : http://tutorials.jenkov.com/java-util-concurrent/java-fork-and-join-forkjoinpool.html

--

--