RecursiveTask — 결과를 반환하는 재귀 ForkJoinTask
RecursiveTask — 결과를 반환하는 재귀 ForkJoinTask
RecursiveTask<V>는 결과를 반환하는 재귀 ForkJoinTask 예요. 각 분할 단계가 결과를 만들어내는 분할 정복 문제를 ForkJoinPool에서 병렬 처리할 때 표준으로 써요.
본문
개념 이해하기
RecursiveTask<V>는 결과를 반환하는 재귀 ForkJoinTask예요. 타입 매개변수 V는 태스크의 결과 타입이에요.
public abstract class RecursiveTask<V>
extends ForkJoinTask<V>
implements Serializable
활용 예 — 팩토리얼 계산
import java.util.concurrent.RecursiveTask;
import java.math.BigInteger;
public class Factorial {
static class FactorialTask extends RecursiveTask<BigInteger> {
private final int from, to;
FactorialTask(int from, int to) { this.from = from; this.to = to; }
protected BigInteger compute() {
int range = to - from;
if (range == 0) { // base case
return BigInteger.valueOf(from);
} else if (range == 1) { // too small to parallelize
return BigInteger.valueOf(from).multiply(BigInteger.valueOf(to));
} else { // split in half
int mid = from + range / 2;
FactorialTask leftTask = new FactorialTask(from, mid);
leftTask.fork(); // perform about half the work locally
return new FactorialTask(mid + 1, to).compute()
.multiply(leftTask.join());
}
}
}
static BigInteger factorial(int n) { // uses ForkJoinPool.commonPool()
return (n <= 1) ? BigInteger.ONE : new FactorialTask(1, n).invoke();
}
public static void main(String[] args) {
System.out.println(factorial(Integer.parseInt(args[0])));
}
}
메서드
public RecursiveTask() — 서브클래스가 호출할 생성자.
protected abstract V compute() — 이 태스크가 수행하는 주요 계산. 결과를 반환해요.
public final V getRawResult() — ForkJoinTask.join()이 반환할 결과를 반환해요(비정상 완료여도). 디버깅·확장 지원용.
protected final void setRawResult(V value) — 주어진 값을 결과로 반환하도록 강제해요. 확장 지원용.
protected final boolean exec() — RecursiveTask의 실행 관례를 구현해요. 정상 완료되면 true.