자바의 정석 정리
자바의 정석 - 13.11 fork & join 프레임워크
ksb-dev
2022. 8. 29. 10:44
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();
}