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;
	}

Untitled

⇒ 아래를 구현해 본 것

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(); // 병합 및 반환 
        }
    }
}