자바 프로그램을 실행하면 하나의 프로세스가 동작하고, 그 프로세스는 하나 이상의 스레드로 이루어진다. 이 스레드를 더욱 효율적으로 사용하기 위한 클래스를 소개해 보겠다. 그 시작은 Fork/Join을 이해하는 것이다.
Fork는 여러 개를 나누는 작업을 말하고, Join은 작업 결과를 모으는 것이라고 생각하면 된다.
여기서 나아가 Work Stealing이라는 개념도 들어가는데,
여러 개의 Dequeue에 작업이 나뉘어져 어떤 일이 진행될 때 만약 하나의 Dequeue는 바쁘고, 다른 Dequeue는 바쁘지 않을 때가 있다. 이럴 경우 할 일이 없는 Dequeue가 바쁜 Dequeue에 대기하고 있는 일을 가져가서 해 주는 것이라고 생각하면 된다.
(※참고 : 입구와 출구가 정해져 있는 Queue와는 달리, Dequeue는 양쪽 끝이 모두 입구와 출구가 되는 구조이다.)
이같은 Work Stealing이 Fork/Join에 기본적으로 포함돼 있다.
기본적인 수행 개념은 다음과 같다.
if(작업 단위가 충분히 작을 경우){
해당작업 수행
}else{
작업을 반으로 쪼개어 두 개 작업으로 나눔.
두 작업을 동시에 실행, 두 작업 끝날 때까지 결과를 기다림
}
보통 이 연산은 회귀적(Recursive)으로 수행된다.
ForkJoinPool을 사용하려면 기본적으로 알아야 할 클래스들이 있다.
ForkJoinPool
RecursiveTask
RecursiveAction
ForkJoinTask