본문 바로가기

자바의 정석 정리

자바의 정석 - 13.11 fork & join 프레임워크

13.11.1 RecursiveAction과 RecursiveTask

  • RecursiveAction : 반환값이 없는 작업 구현
  • RecursiveTask : 반환값이 있는 작업 구현
public abstract class RecursiveAction extends ForkJoinTask<Void>{
    protected abstract void compute();
}

public abstract class RecursiveTask<V> extends ForkJoinTask<V>{
    V result;
    protected abstract V compute(); //run()
}
ForkJoinPOOL pool = new ForkJoinPOOL();
SumTask task = new SumTask(from, to);
Long result = pool.invoke(task); //start()

13.11.2 compute() 구현

  • 일반적으로 재귀호출 메서드와 동일
  • fork() : 해당 작업을 쓰레드 풀의 작업 큐에 넣는다. 비동기 메서드
  • join() : 해당 작업의 수행이 끝날 때까지 기다렸다가, 수행이 끝나면 결과 반환. 동기 메서드
public Long compute() {
        long size = to - from;
        if(size <= 5)
            return sum();
        long half = (from+to)/2;
        // 범위를 반으로 나눠서 두 개의 작업을 생성
        SumTask leftSum  = new SumTask(from, half);
        SumTask rightSum = new SumTask(half+1, to);
        leftSum.fork();
        return rightSum.compute() + leftSum.join();
    }