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();
}
'자바의 정석 정리' 카테고리의 다른 글
자바의 정석 - 15.2 바이트기반 스트림 (0) | 2022.08.30 |
---|---|
자바의 정석 - 15.1 입출력 및 스트림 (0) | 2022.08.30 |
자바의 정석 - 13.10 volatile (0) | 2022.08.29 |
자바의 정석 - 13.9 쓰레드 동기화(Synchronized) (0) | 2022.08.29 |
자바의 정석 - 13.8 쓰레드 실행제어 (0) | 2022.08.29 |