해당 메소드를 사용시, 메인 부모 스레드가 하나 이상의 자식 스레드를 생성(Fork)한 다음 자식의 종료를 기다린 후 join하고 그 시점부터 자식의 결과를 확인하고 결합한다.
이 동기적 생성 모델은 명시적 생성 모델이라고도 불린다.
Java 에서의 Fork Join
Task(problems)
if(Task가 충분히 작은경우){
직접 해결하는 메서드
}else{
subTask1 = fork(new Task(sub_pro);
subTask2 = fork(new Task(sub_pro);
result1 = join(subTask1);
result2 = join(subTask1);
return combined results;
}
⇒ 아래를 구현해 본 것
import java.util.concurrent.RecursiveTask;
//반환을 하지않는 RecursiveAction과 다르게 RecursiveTask는 반환값이 있다.
public class SumTask extends RecursiveTask<Integer> {
static final int THRESHOLD = 1000;
private int begin;
private int end;
private int[] array;
public SumTask(int begin, int end, int[] array) {
this.begin = begin;
this.end = end;
this.array = array;
}
@Override
protected Integer compute() {
if(end - begin < THRESHOLD) {
//충분히 작아 직접 해결하는 경우
int sum = 0;
for(int i = begin; i < end; i++) {
sum += array[i];
}
}else{
//Fork - join
int mid = (begin + end) / 2;
SumTask leftTask = new SumTask(begin, mid, array); // 재귀적
SumTask rightTask = new SumTask(mid + 1, end, array);
leftTask.fork();
rightTask.fork();
return leftTask.join() + rightTask.join(); // 병합 및 반환
}
}
}